Andorid学习 View.post

来源:互联网 发布:王勇java 编辑:程序博客网 时间:2024/06/05 16:32

参考:

http://www.cnblogs.com/qingblog/archive/2012/08/08/2628245.html

Hanler.post , View.post 都可用来更新UI 两者差异

以下代码/在UI主线程中运行方法,不创建一个新进程,为什么在主线程中运行?与在子线程中运行区别?

 Handler mHandler=new Handler();//不加Looper,则默认管理消息队列的为主线程Looper,也可这么写 (线程产生一个looper,用来管理这个线程的消息队列,传来的消息就在这个looper管理的消息队列中排队)

 * HandlerThread handlerThread = new HandlerThread("myHandlerThread");

 * handlerThread.start();

 * handler = new Handler(handlerThread.getLooper());

 mHandler.post(new Runnable(){   @Override public void run()   { // TODO Auto-generated method stub 
//匿名类,运行在UI主线程,所以千万别做复杂的计算逻辑     }  });

我们可以通过调用handler的post方法,把Runnable对象(一般是Runnable的子类)传过去;handler会在looper中调用这个Runnable的Run方法执行。

Runnable是一个接口,不是一个线程,一般线程会实现Runnable。所以如果我们使用匿名内部类是运行在UI主线程的,如果我们使用实现这个Runnable接口的线程类,则是运行在对应线程的。

View.post(Runnable)
View.post(Runnable)方法。在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。

如下图,前面看到的代码,我们这里Message的callback为一个Runnable的匿名内部类

这种情况下,由于不是在新的线程中使用,所以千万别做复杂的计算逻辑。

view.post和handle.post这两个方法差不多,都是在post方法中传入一个实现了Runnable接口的对象,在这个对象的run方法中实现

mButton.post(new Runnable()//这里用的是view的post方法,如果用Handler就是换成handler.post            {//这里的内容将在主线程中显示                @Override                public void run()                {                    mTextView.setText("yes 获取到数据了~~~");                }            });



0 0