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 回答
0

这就是我解决这个问题的方法。在surfaceCreated 方法中,线程的状态可能已更改为TERMINATED。您需要创建一个新的线程。

@Override
 public void surfaceCreated(SurfaceHolder holder) {
     bgSurfaceThread = bgSurfaceThread.getState().equals(Thread.State.TERMINATED) ? bgSurfaceThread : new BackgroundSurfaceThread(BackgroundSurfaceView.this);
    bgSurfaceThread.setRunning(true);
   bgSurfaceThread.start();
}
于 2018-05-26T03:20:40.330 回答