繁体   English   中英

Android Java在thread.start之后崩溃

[英]Android java crash after thread.start

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

并调用胎面:

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:仅原始线程创建视图层次结构的对象可以触摸其视图。 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(查看.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):在week8.handin Week8Handin.countingDow n(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):位于java.lang.Thread.run(Thread.java:841)

您正在不是主(UI)线程的线程中执行UI操作( button.setText() )。 你需要一个HandlerAsyncTask来实现这一目标-读对他们进一步的信息,以及对整个“没有在主线程”的东西-或者至少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");
        }
    });
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM