android.view.ViewRootImpl$CalledFromWrongThreadException

android.view.ViewRootImpl$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.

(只有创建了UI对象的主线程才能去修改UI)

解决方案一:

在 Android 不是线程安全的, Android 有阻止子线程更新 UI 的机制。在 Android 编程中,需要在主线程之外的一个单独的子线程中进行某些耗时操作,然后更新用户界面显示。但是,在主线程之外的线程中直接更新 UI 显示的问题是:系统会报这个异常,必须在程序的主线程(也就是 UI 线程)中进行更新界面显示的工作。于是我们应该将 UI 的更新交给主线程来完成,Android为我们提供了一套消息处理机制。

实现步骤:
  在 Activity 的 onCreate(Bundle savedinstancestate){} 中创建一个Handler类的实例 mHandler,在这个mHandler 实例的 handleMessage(msg) 方法的回调方法中调用更新界面显示的方法。例如:

public class ExampleActivity extends Activity {  
    Handler h = null;  
    @override  
    public void onCreate(Bundle savedinstancestate){  
        h = new Handler(){  
            @override  
            public void handleMessage(Message msg){  
                // call update gui method.  
            }  
        };  
    }  
}  

 在其它的函数中,利用 send族或post族函数向这个 mHandler 发送或邮寄消息即可。
 如果使用 Handler 后还是会报这个错,就 把 handleMessage(msg)改成sendMessage(msg) 试试。
 

解决方案二:

利用 activity.runOnUiThread(new Runnable(){}),把更新 UI 的代码创建在 runnable 中,然后在需要更新 UI 时,把这个 Runnable 对象传给 activity.runOnUiThread(runnable) 。 这样 runnable 对像就能在ui程序中被调用。

getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                    }
                });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值