更新UI时遇到:Only the original thread that created a view hierarchy can touch its views.

来源:互联网 发布:海马模拟器有mac版 编辑:程序博客网 时间:2024/05/19 16:51

Only the original thread that created a view hierarchy can touch its views。原因是android中相关的view和控件不是线程安全的,我们必须单独做处理。我用Handler来解决。


Handler的官方描述:


A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue


Handler的使用场合: 

1、 to schedule messages and runnables to be executed as some point in the future;

      安排messages和runnables在将来的某个时间点执行。

2、 to enqueue an action to be performed on a different thread than your own.

      将action入队以备在一个不同的线程中执行。即可以实现线程间通信。比如当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。


我的用法是,

声明一个成员变量:private Handler handler=null;

在onCreate()方法里:

handler=new Handler()

{

@Override

public void handleMessage(Message msg)

{

if(msg.arg1==1)

{

adapter=new MovieListAdapter(ListActivity.this,movieInfos);

gridView.setAdapter(adapter);

}

}

};


再设一个线程,调制当处理完毕数据库的操作时再去更新UI。

new Thread(new Runnable(){

    @Override

    public void run()

    {

Message msg=handler.obtainMessage();

movieInfos=movieUtils.getMovieInfos(ListActivity.this);

msg.arg1=1;

handler.sendMessage(msg);

    }

}).start();