Android BUG 之 Only the original thread that created a view hierarchy can touch its views.

前言

这个异常通常是由于尝试在非 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 使用 HandlerAsyncTask 等机制,将代码放到 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 还是很哇塞的,携参 方便

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值