0

簡単な質問があります:

rlMF という名前のスレッドがあります。私はこのように作成しました:

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

    public void stopTh() {
        activityStopped = true;
    }
});

今、外側のスレッドから stopTh 関数を呼び出したいと思います。単純に rlMF.stopTh(); を呼び出せないのはなぜですか。他に何ができますか?

例:

protected void onPause() {
    Log.d("Info", "destroying...");
    activityStopped = true;
    rlMF.stopTh();
    super.onPause();
}

動かない...

4

3 に答える 3

2

アクセス可能なインターフェイスはThread. 外部からメソッドにアクセスできるようにするには、このメソッドを公開する型を指定する必要があります。

よく見ると、メソッドは のインスタンスに実装されていますRunnable。でさえありませんThread

Runnableオブジェクトに本当にアクセスする必要がある場合は、次のようにすることができます。

class MyRunnable implements Runnable {
    public void run() {
    ...
    }

    public void fooBar() {
    ...
    }       
}

public void someMethod() {
    MyRunnable myRunnable = new MyRunnable();
    Thread thread = new Thread(myRunnable);
    ...
    myRunnable.fooBar();
    ...
}
于 2012-07-10T09:54:35.300 に答える
0

あなたが達成しようとしていること以外に、フランシスコのアプローチの例。多分これはあなたを正しい方向に向けることができます

public class CustomRun implements Runnable {
    public void run() {
        reloadMissingFiles();
        stopTh();
    }

    public void stopTh() {
        activityStopped = true;
    }
}

あなたのコードで

// start thread with custom runner
CustomRun runner = new CustomRun();
new Thread(runner).start();

// call your stopTh method on CustomRun class
protected void onPause() {
    Log.d("Info", "destroying...");
    activityStopped = true;
    runner.stopTh();
    super.onPause();
}
于 2012-07-10T10:06:18.053 に答える
0

あなたの目標は、スレッドを から中断することonPauseです。それにはいくつかの方法がありますが、基本的には、reloadMissingFiles.

オプション1

あなたがしたようにブール値フラグを使うことができます -volatile変更がスレッド間で確実に見えるように宣言する必要があります:

private volatile boolean activityStopped = false;

public void reloadMissingFiles() {
    while (!activityStopped) {
       //load small chunks so that the activityStopped flag is checked regularly
    }
}

public Thread rlMF = new Thread(new Runnable() {
    public void run() {
        reloadMissingFiles(); //will exit soon after activityStopped has been set to false
    }
});

protected void onPause() {
    //This will stop the thread fairly soon if the while loop in
    //reloadMissingFiles is fast enough
    activityStopped = true;
    super.onPause();
}

オプション 2 (より良いアプローチ)

あなたが で何をしているのかはわかりませんがreloadMissingFiles、それはある種の I/O 操作であり、通常は割り込み可能であると思います。次に、InterruptedException がキャッチされるとすぐに停止する中断ポリシーを設定できます。

public void reloadMissingFiles() {
    try {
        //use I/O methods that can be interrupted
    } catch (InterruptedException e) {
        //cleanup specific stuff (for example undo the operation you started
        //if you don't have time to complete it
        //then let the finally block clean the mess
    } finally {
        //cleanup (close the files, database connection or whatever needs to be cleaned
    }
}

public Thread rlMF = new Thread(new Runnable() {
    public void run() {
        reloadMissingFiles(); //will exit when interrupted
    }
});

protected void onPause() {
    runner.interrupt(); //sends an interruption signal to the I/O operations
    super.onPause();
}

注:この記事を読んで、より詳細なバージョンを確認することもできます。

于 2012-07-10T10:58:18.487 に答える