我在Play商店中发布了一个Android应用,崩溃报告显示了致命异常:java.lang.IllegalThreadStateException:线程已启动

public void refresh(){
    if (Thread.currentThread() != mThread) {
        mThread = new Thread() {
            @Override
            public void run() {
                refresh();
            }
        };
        mThread.start();//<<<<<<<<<<<<<here
        return;
    }
    doSomeCoolStuff();
}

怎么会这样这是一个新线程?

梅丁·羽衣甘蓝

最佳答案

在竞赛条件下可能会发生这种情况。在两个语句之间(将值分配给mThread并调用start()方法),执行可以切换到另一个线程,该线程可以再次进入refresh()方法,为mThread分配另一个线程,然后启动它。当第一个线程恢复执行时,mThread将包含一个不同的线程(已经启动),并且start()方法将失败,并带有您描述的异常。

解决此问题的一种方法是将new Thread()的结果存储在本地变量中,然后在该变量上调用start()方法,然后将其保存到字段中。 (这可能不是最合适的解决方法,但是如果不知道问题发生的具体环境的更多细节,就不可能多说。)

09-04 06:38