android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
时间: 2023-11-18 13:19:55 浏览: 31
这个异常通常是因为在非UI线程中尝试更新UI造成的。Android中的UI组件只能在UI线程中被修改,如果在非UI线程中直接修改UI组件,就会出现这个异常。
解决这个问题的方法是使用Android提供的一些API来在UI线程中更新UI组件。比如可以使用Handler或者View.post等方法来将更新UI的操作发送到UI线程中执行。也可以使用AsyncTask等异步任务来在后台线程执行一些操作,并在执行完成后通过回调机制在UI线程中更新UI组件。
具体的解决方案可以根据具体的业务需求和场景来选择。但需要注意的是,在任何情况下都不能在非UI线程中直接更新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 控件的操作
}
});
```