什么是生命周期感知方式来实现重复的AsyncTask?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是生命周期感知方式来实现重复的AsyncTask?相关的知识,希望对你有一定的参考价值。

片段需要每n秒刷新一次数据(来自网络)。当Fragment暂停时,它需要停止这样做。此外,如果在片段暂停后网络数据到达,则应忽略它。

现在,我每隔n秒使用一个Handler的sendMessageDelayed,它会创建一个AsyncTask,而AsyncTask会将响应发送回Handler。然后,处理程序更新UI。

但是,当Fragment暂停或活动结束时,会产生内存泄漏。

此外,当Fragment不再处于活动状态时,更新UI将提供NPE

下面的代码非常幼稚,内存泄漏

class MyFragment : Fragment() {
    override fun onPause() {
        super.onPause()
        handler.removeMessages(Consts.FETCH_DATA) //stop refreshing when paused
    }

    override fun onResume() {
        super.onResume()
        val msg = handler.obtainMessage(Consts.FETCH_DATA)
        handler.sendMessageDelayed(msg, 60*1000) //start refreshing again
    }
    val handler = MyHandler()

    inner class MyHandler: Handler(){
        override fun handleMessage(m: Message) {
            val pair = m.obj as Pair<String, Any>
            val command = pair.first
            val data = pair.second
            when(m.what){
                Consts.POPULATE_DATA -> {
                    //findViewById and put data
                    //schedule the next refresh
                    val msg = obtainMessage(Consts.FETCH_DATA)
                    sendMessageDelayed(msg, 60*1000)
                }
                Consts.FETCH_DATA -> {
                    MyAsyncTask(this).execute() 
                    //this sends Consts.POPULATE_DATA to this handler
                    //after a network request
                }
            }
        }
    }
}
答案

这是一种方法。在每个sendMessageDelayed之前你想调用make if语句来检查FragmentActivity的验证

if(isActivity && isFragment){
sendMessageDelayed(msg, 60*1000);
}

然后将isActivity添加到你的Activity

public class MyFragment extends Fragment{
boolean isActivity;

    @Override
    protected void onResume() {
        super.onResume();
        isActivity = true;
    }

 @Override
    protected void onStop() {
        super.onStop();
        isActivity = false;
    }


}

和你一样Fragment

public class MainActivity extends Activity{
boolean isFragment;

    @Override
    protected void onResume() {
        super.onResume();
        isFragment= true;
    }

 @Override
    public void onStop() {
        super.onStop();
        isFragment= false;
    }

}

如果你在另一个班级使用它们,请制作isActivityisFragment public static

Activity运行时,在Foreground中,sendMessageDelayed将被调用,当你最小化应用程序或关闭活动时,sendMessageDelayed将不再被调用

要了解更多信息,请参阅thisActivity and Fragment Lifycicle

以上是关于什么是生命周期感知方式来实现重复的AsyncTask?的主要内容,如果未能解决你的问题,请参考以下文章

Android mvvm 之 LiveData 的原理

Android LifeCycles之让组件感知生命周期的使用(生命周期观察者)

Android Lifecycle源码解析

Lifecycle详细分析

Flutter 没有完整的生命周期?

Flutter 没有完整的生命周期?