什么是生命周期感知方式来实现重复的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
语句来检查Fragment
和Activity
的验证
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;
}
}
如果你在另一个班级使用它们,请制作isActivity
和isFragment
public static
当Activity
运行时,在Foreground
中,sendMessageDelayed
将被调用,当你最小化应用程序或关闭活动时,sendMessageDelayed
将不再被调用
以上是关于什么是生命周期感知方式来实现重复的AsyncTask?的主要内容,如果未能解决你的问题,请参考以下文章