フラグメントは、(ネットワークからの)データをn秒ごとにリフレッシュする必要があります。フラグメントが一時停止しているときは、それをやめる必要があります。また、の後にネットワークデータがに到着した場合、そのフラグメントは一時停止されます。これは無視する必要があります。繰り返すAsyncTaskを実装するライフサイクル対応の方法は?
今は、ハンドラのsendMessageDelayedをn秒ごとに使用して、AsyncTaskを作成し、AsyncTaskがレスポンスをハンドラに返送します。ハンドラはUIを更新します。
ただし、フラグメントが一時停止するか、アクティビティが終了すると、メモリリークが発生します。また
、フラグメントは、NPEを与えるだろうUIを更新し、アクティブでなくなった
以下のコードはかなりナイーブとメモリがいっぱいです。これは、それを行うための一つの方法は、
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
}
}
}
}
}
あなたはAsyncTaskの代わりにAsyncTaskLoaderを使う必要があると思います。 –
@sunilkushwah AsyncTaskLoader。私はそうだったと思う。ハンドラを取り除くと、n秒ごとにデータをリロードするための非厄介な方法はありますか? – arnab321
ハンドラも良いアプローチですが、あなたが変更したい場合は、アンドロイドでタイマーを使用することができます –