thread.start之后的Android java崩溃

时间:2013-10-22 19:06:59

标签: java android multithreading

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

    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");}

并打电话给Tread:

new Thread(new Runnable() {

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

我真的很感激!

我的logCat显示以下内容(抱歉这个烂摊子):

  

10-22 14:59:43.319:E / AndroidRuntime(961):致命异常:Thread-81   10-22 14:59:43.319:E / AndroidRuntime(961):android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。   10-22 14:59:43.319:E / AndroidRuntime(961):在android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5908)   10-22 14:59:43.319:E / AndroidRuntime(961):在android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:869)   10-22 14:59:43.319:E / AndroidRuntime(961):在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):在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):at week8.handin.Week8Handin.countingDown(Week8Handin.java:59)   10-22 14:59:43.319:E / AndroidRuntime(961):at 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)

1 个答案:

答案 0 :(得分:4)

您正在不是主(UI)线程的线程中执行UI操作(button.setText())。您需要HandlerAsyncTask才能完成此操作 - 阅读this以获取有关它们以及整体'不在主线程中'的更多信息 - 或者至少{{1}以下示例(您需要声明runOnUiThread()变量button才能生效):

final

如果您有其他问题,请告诉我们。