前言
这个异常通常是由于尝试在非 UI 线程中更新 UI 组件而引起的。在 Android 应用程序中,UI 组件只能在 UI 线程中访问和更新。如果你在非 UI 线程中尝试更新 UI 组件,就会抛出这个异常。
解决
解决这个问题的方法是,确保所有 UI 操作都在 UI 线程中执行。Android 提供了一些机制,可以将代码放到 UI 线程中执行,例如
1 使用 View.post(Runnable)
方法或 View.postDelayed(Runnable, long)
方法,将代码放到 UI 线程的消息队列中,等待 UI 线程处理。例如:
view.post(new Runnable() {
@Override
public void run() {
// 在 UI 线程中执行操作
view.setText("Hello, world!");
}
});
2 使用 Activity.runOnUiThread(Runnable)
方法,将代码放到 Activity 的 UI 线程中执行。例如:
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// 在 UI 线程中执行操作
view.setText("Hello, world!");
}
});
3 使用 Handler
或 AsyncTask
等机制,将代码放到 UI 线程中执行。例如:
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
// 在 UI 线程中执行操作
view.setText("Hello, world!");
}
});
// 或者使用 AsyncTask
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
// 在后台线程中执行操作
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// 在 UI 线程中执行操作
view.setText("Hello, world!");
}
}.execute();
上面的代码中,都将操作包装到一个 Runnable
对象中,并使用相应的机制将其提交到 UI 线程中执行。这样就可以避免在非 UI 线程中更新 UI 组件而引起的异常。
总结
如果只是修改UI,建议使用第二种但扩展性不强,如果还有其他需求第三种 handler 还是很哇塞的,携参 方便