0

フラグメントは、(ネットワークからの)データを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 
       } 
      } 
     } 
    } 
} 
+1

あなたはAsyncTaskの代わりにAsyncTaskLoaderを使う必要があると思います。 –

+0

@sunilkushwah AsyncTaskLoader。私はそうだったと思う。ハンドラを取り除くと、n秒ごとにデータをリロードするための非厄介な方法はありますか? – arnab321

+0

ハンドラも良いアプローチですが、あなたが変更したい場合は、アンドロイドでタイマーを使用することができます –

答えて

0

でリークします。あなたはFragmentActivity

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

の検証をチェックするif声明を出す呼び出したいすべてのsendMessageDelayedは、あなたFragment

public class MainActivity extends Activity{ 
boolean isFragment; 

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

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

} 
のためにあなたの Activity

public class MyFragment extends Fragment{ 
boolean isActivity; 

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

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


} 

と同じにisActivityを追加する前に

make isActivityおよびisFragmentpublic staticあなたがアプリを最小化またはもはや呼ばれませんsendMessageDelayedアクティビティを閉じると、呼び出されます別のクラス

これにより

Activityが実行されているとForegroundsendMessageDelayed中でそれらを使用する場合

関連付けるためにこれをもっと見るActivity and Fragment Lifycicle

関連する問題