android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
时间: 2023-11-18 13:58:34 浏览: 37
这个异常是因为在非UI线程中尝试更新UI视图,而Android UI操作只能在主线程中执行。解决这个问题的方法是使用runOnUiThread方法将UI操作投递到主线程中执行。例如:
```
runOnUiThread(new Runnable() {
@Override
public void run() {
// 在此处执行UI操作
}
});
```
另外,您还可以使用Handler或AsyncTask等其他方式来处理UI更新,具体取决于您的代码逻辑和需求。
相关问题
解决报错android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
在Android开发中,当从非UI线程中访问UI组件时,就会抛出 `android.view.ViewRootImpl$CalledFromWrongThreadException` 异常。这是因为Android中的UI组件不是线程安全的,只能在主线程中更新UI。
要解决这个问题,有以下几种方法:
1. 使用 `runOnUiThread()` 方法
`runOnUiThread()` 方法可以在主线程中执行一个Runnable对象。因此,如果需要在非UI线程中更新UI,可以使用 `runOnUiThread()` 方法来实现。
例如:
```
runOnUiThread(new Runnable() {
public void run() {
// 在这里更新UI
}
});
```
2. 使用 `Handler` 类
`Handler` 类可以用于在不同的线程之间传递消息和任务。通过在主线程中创建一个 `Handler`,并将其传递给子线程,就可以在子线程中更新UI。
例如:
```
Handler handler = new Handler(Looper.getMainLooper());
// 在子线程中发送消息
new Thread(new Runnable() {
public void run() {
Message message = handler.obtainMessage();
message.what = 1;
handler.sendMessage(message);
}
}).start();
// 在主线程中处理消息
handler = new Handler(Looper.getMainLooper()) {
public void handleMessage(Message msg) {
// 在这里更新UI
}
};
```
3. 使用 `AsyncTask` 类
`AsyncTask` 类可以用于在后台线程中执行耗时操作,并在主线程中更新UI。在 `AsyncTask` 的 `doInBackground()` 方法中执行耗时操作,在 `onPostExecute()` 方法中更新UI。
例如:
```
private class MyTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
// 在这里执行耗时操作
return null;
}
protected void onPostExecute(Void result) {
// 在这里更新UI
}
}
// 在主线程中执行异步任务
new MyTask().execute();
```
总之,无论使用哪种方法,都需要保证更新UI的操作在主线程中执行。
安卓报错E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher Process: com.example.flower_finall, PID: 5686 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
这个错误是因为你在非 UI 线程中更新了 UI 控件,导致出现了 CalledFromWrongThreadException 异常。通常出现在使用 OkHttp 等网络库发送网络请求后,更新 UI 控件的操作。解决方法是使用 runOnUiThread() 方法或者 Handler 将更新 UI 的操作切换到主线程中执行。例如:
```
runOnUiThread(new Runnable() {
@Override
public void run() {
// 更新 UI 控件的操作
}
});
// 或者
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
// 更新 UI 控件的操作
}
});
```
阅读全文