2013-10-22 77 views
0

由于某种原因,我的程序在完成thread.start方法后崩溃。由于这是我第一次使用线程,我完全迷失了方向,不知道发生了什么。thread.start后Android java崩溃

public void countingDown() { 

waitingTime = (long) (Math.random() * 1000 + 3000); 
button.setText("Wait"); 
try { 
    Thread.sleep(waitingTime); 
} catch (Exception e) { 
} 
time1 = System.currentTimeMillis(); 
button.setText("Press");} 

,并呼吁轮距:

new Thread(new Runnable() { 

        @Override 
        public void run() { 
         countingDown(); 
        } 
       }).start(); 

我会很感激!

我的logcat显示以下(抱歉混乱):

10-22 14:59:43.319:E/AndroidRuntime(961):致命异常:螺纹81 10-22 14: 59:43.319:E/AndroidRuntime(961):android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程可以触及其视图。 E/AndroidRuntime(961):at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5908) 10-22 14:59:43.319:E/AndroidRuntime(961):at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:869) 10-22 14:59:43.319:E/AndroidRuntime(961):at android.view.ViewGroup.invalidateChild(ViewGroup.java:4253) 10-22 14:59:43.319:E/AndroidRuntime(961):在android.view.View.invalidate(View.java:10539) 10-22 14:59:43.319:E/AndroidRuntime(961):在android.view。 View.invalidate(View.java:10494) 10-22 14:59:43.319:E/AndroidRuntime(961):at android.widget.TextView.checkForRelayout(TextView.java:6511) 10-22 14:59: 43.319:E/AndroidRuntime(961):在android.widget.TextView.setText(TextView.java:3771) 10-22 14:59:43.319:E/AndroidRuntime(961):在android.widget.TextView.setText(TextView.java:3629) 10-22 14:59:43.319:E/AndroidRuntime(961):在android.widget.TextView.setText(TextView.java: 3604) 10-22 14:59:43.319:E/AndroidRuntime(961):在week8.handin.Week8Handin.countingDown(Week8Handin.java:59) 10-22 14:59:43.319:E/AndroidRuntime(961) :在week8.handin.Week8Handin $ 1.run(Week8Handin.java:82) 10-22 14:59:43.319:E/AndroidRuntime(961):at java.lang.Thread.run(Thread.java:841)

+0

Line,Exception !! – hasan83

+0

错误是关于访问'button'变量不是线程安全的,有没有其他线程运行花花公子? – 2013-10-22 19:14:15

+1

这是正确的。您只能访问主UI线程中的按钮。 –

回答

4

您正在非主(UI)线程的线程中执行UI操作(button.setText())。你需要一个HandlerAsyncTask来完成 - 阅读this了解更多关于它们的信息以及整体“不在主线程”内 - 或至少runOnUiThread(),如下面的示例所示(您需要声明button变量final为它工作):

public void countingDown() { 

    waitingTime = (long) (Math.random() * 1000 + 3000); 
    button.setText("Wait"); 
    try { 
     Thread.sleep(waitingTime); 
    } catch (Exception e) { 
    } 

    time1 = System.currentTimeMillis(); 

    runOnUiThread(new Runnable() { 
     public void run() { 
      button.setText("Press"); 
     } 
    }); 
} 

如果您还有其他问题,请让我们知道。