以下のコードがあります。
//This is global for the activity.
Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
//update the UI
}
};
私の onResume() では、ランナブルを実行する新しいスレッドを開始しています。
protected void onResume()
{
super.onResume();
Thread t = new Thread(runnable);
t.start();
}
私のランナブルは次のとおりです。
Runnable runnable = new Runnable()
{
public void run()
{
// some networking stuff
// some db stuff
// whatever
handler.sendEmptyMessage(0);
handler.postDelayed(new Runnable()
{
public void run()
{
new Thread(runnable).start();
}
}, 30000);
}
}
そして、私は onPause() の中にこれを持っています:
protected void onPause()
{
super.onPause();
handler.removeCallbacks(runnable);
}
最後に を呼び出して を呼び出し、handler.sendEmptyMessage(0);
UIhandleMessage(Message msg)
を変更します。タスクを繰り返しますが、新しいランナブルを開始すると、これと同じランナブルを実行する新しいスレッドが開始されます。
明確化のための質問:
onResume() 内で新しいスレッドを開始しています。これは、ランナブルが UI スレッドで実行されていないことを意味しますが、ハンドラーは UI スレッドで作成されており、UI スレッドに自然にアタッチされています。UI はどのように完璧に変更されていますか?
handler.removeCallbacks(runnable) が想定されていますが、アプリを最小化すると、runnable は 30 秒ごとに実行され続けます。(これは、作成されたハンドラーに関連付けられていない新しいスレッド上にあるためである可能性があります)。どうすれば停止できますか?