java - Android java 在 thread.start 后崩溃

标签 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): FATAL EXCEPTION: Thread-81 10-22 14:59:43.319: E/AndroidRuntime(961): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 10-22 14:59:43.319: 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): at android.view.View.invalidate(View.java:10539) 10-22 14:59:43.319: E/AndroidRuntime(961): at 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): at android.widget.TextView.setText(TextView.java:3771) 10-22 14:59:43.319: E/AndroidRuntime(961): at android.widget.TextView.setText(TextView.java:3629) 10-22 14:59:43.319: E/AndroidRuntime(961): at 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)

最佳答案

您正在非主 (UI) 线程的线程中执行 UI 操作 (button.setText())。您需要一个 HandlerAsyncTask 来完成此任务 - 请阅读 this有关它们以及整个“不在主线程中”的更多信息 - 或者至少像下面的示例一样 runOnUiThread() (您需要声明您的 button code> 变量 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");
        }
    });
}

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

关于java - Android java 在 thread.start 后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19526236/

相关文章:

java - 如何使用相同的 Scanner 方法返回超过 1 个值?

java - Weblogic 12c JPA 2.1 Spring 启动

java - 包cucumber.api.java.en 不存在cucumber

java - 来自 JAR 的 Spring 依赖注入(inject)

android - Anko中如何设置垂直布局中的按钮颜色

multithreading - 创建的线程数为12,但仍只能在12个核心CPU的一个核心上运行

java - 暂停时保持相机 Activity

android - 在 ant build 中使用 aapt 进行紧缩/资源打包使用其他项目的缓存

c# - 线程无法访问对象

iphone - 什么是网络线程?