0

引き出しスレッドを再開するためにそのコードを使用する LunarLander の例を確認します。

public void surfaceCreated(SurfaceHolder holder) {
    // start the thread here so that we don't busy-wait in run()
    // waiting for the surface to be created
    thread.setRunning(true);
    thread.start();
}

そしてこれは終わりです:

public void surfaceDestroyed(SurfaceHolder holder) {
    // we have to tell thread to shut down & wait for it to finish, or else
    // it might touch the Surface after we return and explode
    boolean retry = true;
    thread.setRunning(false);
    while (retry) {
        try {
            thread.join();
            retry = false;
        } catch (InterruptedException e) {
        }
    }
}

しかし、プロジェクトを実行すると、ホームボタンを押してアプリケーションを再開し、クラッシュします

 java.lang.IllegalThreadStateException: Thread already started.
    at java.lang.Thread.start(Thread.java:1045)
    at com.example.android.lunarlander.LunarView.surfaceCreated(LunarView.java:862)
    at android.view.SurfaceView.updateWindow(SurfaceView.java:533)
    at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:226)
    at android.view.View.dispatchWindowVisibilityChanged(View.java:5839)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:945)

他の例でバックグラウンド スレッドを処理するこの方法を見たことがありますが、クラッシュします。それの何が問題なのですか?

4

3 に答える 3

5

あなたのスレッドはまだ実行中です。正しく停止していないと思います。スレッドを中断する必要があるか、それが私が解決した方法です。したがって、 setRunning とブール値を使用してスレッドを実行する代わりに、次のようなものを使用します。

それを開始するには:

public void surfaceCreated(SurfaceHolder holder) {
    thread.start();
}

スレッドで:

public void run() {

    try {
        while (true) {
            // code here
        }
    }
    catch (InterruptedException e) {
         //disable stuff here
    }
}

そしてそれを止めるには:

public void surfaceDestroyed(SurfaceHolder holder) {
    thread.interrupt();
}

これをすばやく入力しましたが、アイデアが得られるはずです。

于 2012-10-03T19:06:03.933 に答える
0

次のように実行できます。

@Override
public void surfaceCreated(SurfaceHolder holder) {
    if (!thread.isAlive()) {
        thread.start();
    }
}
于 2016-04-13T10:04:49.907 に答える