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

San*_*ung 13 android listview android-lifecycle android-fragments fragment-lifecycle

我有一个Fragment设置a ListView并创建一个定期Handler更新Listview.然而,看起来它Handler仍然在Fragment被破坏后运行.

以下是代码.

@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;
}
Run Code Online (Sandbox Code Playgroud)

ListView销毁之后更新Fragment会导致应用程序崩溃.如何HandlerFragment被摧毁时使其停止?我也想知道如果有任何暂停应用程序的影响Handler也是如此.

Mur*_*ain 23

你需要像这样实现处理程序

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

@Override
public void onDestroy () {

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

}
Run Code Online (Sandbox Code Playgroud)


Nic*_*all 6

您需要存储对处理程序的引用并在片段中运行,然后当片段被销毁时,您需要从传递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();
}
Run Code Online (Sandbox Code Playgroud)