0

由于某种原因,我的程序在完成 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。

4

1 回答 1

4

button.setText()您正在不是主 (UI) 线程的线程中执行 UI 操作 ( )。你需要一个HandlerorAsyncTask来完成它 - 阅读这个以获得关于它们的更多信息以及整个“不在主线程中”的东西 - 或者至少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");
        }
    });
}

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

于 2013-10-22T19:34:27.697 回答