在thread.start之后Android java崩溃
由于某种原因,我的程序在完成thread.start方法后崩溃。由于这是我第一次使用线程,我完全迷路了,不知道发生了什么在thread.start之后Android java崩溃,java,android,multithreading,Java,Android,Multithreading,由于某种原因,我的程序在完成thread.start方法后崩溃。由于这是我第一次使用线程,我完全迷路了,不知道发生了什么 public void countingDown() { waitingTime = (long) (Math.random() * 1000 + 3000); button.setText("Wait"); try { Thread.sleep(waitingTime); } catch (Exception e) { } time1 = System.c
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();
我将非常感激
我的日志显示以下内容(很抱歉弄乱了):
10-22 14:59:43.319:E/AndroidRuntime(961):致命异常:线程81
10-22 14:59:43.319:E/AndroidRuntime(961):android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。
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):在第8周。交接。第8周和第8周。倒计时(第8周和第6周:59)
10-22 14:59:43.319:E/AndroidRuntime(961):在第8周。交车。第8周和1美元。跑步(第8周和第6周:82)
10-22 14:59:43.319:E/AndroidRuntime(961):在java.lang.Thread.run(Thread.java:841)处
您正在非主(UI)线程的线程中执行UI操作(
button.setText()
)。您需要一个处理程序
或异步任务
来完成这一任务-阅读更多关于它们的信息以及总体上“不在主线程中”的内容-或者至少runOnUiThread()
如下示例所示(您需要声明按钮
变量final
才能工作):
如果您还有其他问题,请告诉我们。您正在非主(UI)线程的线程中执行UI操作(
button.setText()
)。您需要一个处理程序
或异步任务
来完成这一任务-阅读更多关于它们的信息以及总体上“不在主线程中”的内容-或者至少runOnUiThread()
如下示例所示(您需要声明按钮
变量final
才能工作):
如果您还有其他问题,请告诉我们。错误是关于访问
按钮的变量不是线程安全的,是否有其他线程运行dude?没错。您只能从主ui线程访问按钮。没有其他线程正在运行。创建新线程时,它与主(ui)线程不同。您只能在UI线程(即不创建任何其他线程时运行的线程)中执行与UI相关的操作,如button.setText()
。错误是访问button
变量不是线程安全的,是否有其他线程运行dude?没错。您只能从主ui线程访问按钮。没有其他线程正在运行。创建新线程时,它与主(ui)线程不同。您只能在UI线程(即不创建任何其他线程时运行的线程)中执行与UI相关的操作,如button.setText()
。我注意到在我的线程中强制转换为CharSequence会导致崩溃。我注意到在我的线程中强制转换为CharSequence会导致崩溃。
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");
}
});
}