当前位置: 首页 > 知识库问答 >
问题:

在片段被销毁后停止处理程序

范楚
2023-03-14

我有一个片段,它设置一个列表视图,并创建一个处理程序来定期更新列表视图。然而,看起来处理程序在片段被销毁后仍然运行。

以下是代码。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    //boilerplate code

    final Handler handler = new Handler();
    handler.post(new Runnable() {
        @Override
        public void run() {
            assignAdapter();
            handler.postDelayed(this, 15000);
        }
    });

    return v;
}

片段被销毁后更新ListView会导致应用程序崩溃。如何在片段被销毁时使Handler停止?我还想知道如果应用程序的任何暂停对Handler也有什么影响。

共有3个答案

邢心水
2023-03-14

使用片段的WeakReference停止处理程序的另一种方法:

static final class UpdateUIRunnable implements Runnable {

        final WeakReference<RouteGuideFragment> weakRefToParent;
        final Handler handler;

        public UpdateUIRunnable(RouteGuideFragment fragment, Handler handler) {
            weakRefToParent = new WeakReference<RouteGuideFragment>(fragment);
            this.handler = handler;
        }

        public void scheduleNextRun() {
            handler.postDelayed(this, INTERVAL_TO_REDRAW_UI);
        }

        @Override
        public void run() {
            RouteGuideFragment fragment = weakRefToParent.get();

            if (fragment == null || fragment.hasBeenDestroyed()) {
                Log.d("UIUpdateRunnable", "Killing updater -> fragment has been destroyed.");
                return;
            }

            if (fragment.adapter != null) {
                try {
                    fragment.adapter.forceUpdate();
                } finally {
                    // schedule again
                    this.scheduleNextRun();
                }
            }
        }
    }

其中<代码>片段。hasBeenDestroyed()只是片段的mDestroyed属性的一个getter:

@Override
public void onDestroy() {
    super.onDestroy();
    mDestroyed = true;
}
黄意智
2023-03-14

您需要在片段中存储对处理程序和runnable的引用,然后当片段被破坏时,您需要从传递runnable的处理程序中删除回调。

private Handler mHandler;
private Runnable mRunnable;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    //boilerplate code

    mRunnable = new Runnable() {
        @Override
        public void run() {
            assignAdapter();
            handler.postDelayed(this, 15000);
        }
    };

    mHandler = new Handler(mRunnable);
    mHandler.post();

    return v;
}

@Override
public void onDestroy() {
    mHandler.removeCallbacks(mRunnable);
    super.onDestroy();
}
高山
2023-03-14

您需要实现这样的处理程序

private Handler myHandler;
private Runnable myRunnable = new Runnable() {
    @Override
    public void run() {
        //Do Something
    }
};

@Override
public void onDestroy () {

    mHandler.removeCallbacks(myRunnable);
    super.onDestroy ();

}
 类似资料:
  • 问题内容: 我通过以下方式创建了线程服务: 关闭应用程序后,电话的工作速度非常慢,我猜这是由于线程终止失败引起的。 有谁知道在终止应用程序之前终止所有线程的最佳方法是什么? 问题答案: 附录 :Android框架为一次性工作,后台工作等提供了许多帮助程序,与在许多情况下尝试滚动自己的线程相比,它们可能更可取。如下面的文章所述,AsyncTask是一个很好的起点。我鼓励读者在开始考虑自己编写线程之前

  • 问题内容: 在我的组织中,我们有许多Redis工作人员来完成我们的关键任务。通常,一天一次或两次,我们的工人会停止处理队列。 该代码基本上如下所示: 如果看到的话,就代码而言,发生的事情并不多,但是每隔一段时间,队列就会开始建立,并且工作程序不会从队列中弹出任何项目。为设置超时根本没有用,因为我们假设问题出在Redis客户端连接上。 目前,我们已经建立了一些侦听器,这些侦听器会在队列建立时提醒我们

  • Android不会在焦点编辑文本中显示键盘,即使当点击它时,在暂停或停止片断后也是如此。例如我专注于编辑文本键盘显示,一切都好,然后我点击home按钮(或者只是离开片段)恢复相同的片段后,焦点仍然在编辑文本,但不能再次显示键盘。来自日志: w/InputMethodManager:当前服务视图不是焦点视图 我只有一个活动,在清单中包含以下信息: 活动Android:name=“.Presentat

  • 我有一个带有片段页面管理器的视图页面管理器,我的应用程序以前只使用了两个片段(不同类型的)而没有问题。 不过,我刚刚添加了第三个片段,现在当我远离它们时,我的适配器/视图寻呼机似乎正在破坏我的片段。例如,如果我在第1页,当我靠近它时,第3页会被销毁并重新创建。如果我在第3页,第1页也会发生同样的事情。 这会导致我的应用出现很多问题。这些碎片根本不是RAM,所以我如何阻止这种情况发生?

  • 问题内容: 我试图弄清楚为什么一旦尝试在线程完成后再次运行线程,此代码就会崩溃。 我第一次单击“开始5个线程”,它运行正常并完成。但是,如果我再次单击它。整个程序崩溃,我得到QThread:线程仍在运行时被销毁错误 可以在网上找到此代码。我正在尝试从中学习。 问题答案: 通过让他作为父母自己来解决这个问题。您必须更改: 至: