1

ユーザーがアクティビティを離れるときにスレッドを停止したい。とてもシンプルに聞こえますが、私が試した機能は機能しません。

コードからアクティビティを開始します

lovi = new Intent(getApplicationContext(), listoverview.class);
lovi.putExtra("reloadAll", true);
startActivity(lovi);

リスト概要のonCreateで、コードを使用してスレッドを開始します

rlMF.start();

そして、rlMFは次のようになります。

public Thread rlMF = new Thread(new Runnable() {
    public void run() {
        reloadMissingFiles();
    }
});

onPauseでrlMF.stop()、. interrupt()、.suspendを使用してみました。それを止めるものは何もありません。

4

3 に答える 3

5

あなたはそれを止めるためにいくつかの旗を追加しなければなりません。他の方法でスレッドを停止すると、リソースリークなどの悲惨な結果が生じる可能性があります。

例えば:

volatile boolean activityStopped = false;

ランナブルを作成する場合:

public Thread rlMF = new Thread(new Runnable() { 

    public void run() {
        while (!activityStopped) {
        // reloadMissingFiles() should check the flag in reality
            reloadMissingFiles(); 
        }
    }
});

onPause()の場合:

protected void onPause(){
    super.onPause();
    activityStopped = true;
}
于 2012-07-10T07:35:49.417 に答える
0

Androidハンドラーの使用

Runnable r = new Runnable()
{
    public void run() 
    {
        // do stuff
        handler.post(this);
    }
};

handler.post(r);

onPauseの場合:

protected void onPause(){
    super.onPause();
    handler.removeCallbacks();
}
于 2012-07-10T07:29:15.307 に答える
0

Threadを試して使用する代わりに、この方法でのメソッドをAsyncTask呼び出すことができます。また、を使用した場合にスローされる可能性のあるものをキャッチすることにも注意する必要があります。cancel(boolean mayInterruptIfRunning)AsyncTaskInteruptedExceptioncancel(true)

これはについての便利なチュートリアルですThreadsHandlersそしてAsyncTaskそれはあなたを助けるかもしれません。

于 2012-07-10T07:30:04.560 に答える