读书人

android handler学习札记

发布时间: 2012-06-26 10:04:13 作者: rapoo

android handler学习笔记

?

1、应用程序启动的时候android会开启一个主线程(UI线程管理界面中的UI控件),如果其中有一个耗时操作,界面会出现假死的现象,如果超过5秒中android系统会有一个提示“强制关闭”信息。


2、更新UI只能在主线程中更新,不能在子线程中更新,不然会牵涉到安全性的问题

为了解决上述两个问题,因此就提出了Handler,它运行在主(UI)线程中,它的子线程可以通过Message对象来传递数据,Handler就承担接受子线程传过来的Message对象(子线程用sendMessage()方法传递),把这些信息(里面包含信息)放入主线程队列中,配合主线程的UI更新。

?

handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
它有两个作用: (1):? 安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行

?

public class HandlerTest extends Activity {HandlerThread handlerThread;MyHandler handler;Message msg;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        System.out.println("main thread id :"+Thread.currentThread().getId());/**         * 生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能         * 这个类由Android应用程序框架提供         */        handlerThread = new HandlerThread("handlerThread");        handlerThread.start();        //用Handler(Looper looper)构造方法开启一个新的线程,与主线程不一致        //如果去掉这个参数,则任然和主线程一致        handler = new MyHandler(handlerThread.getLooper());        msg = handler.obtainMessage();        //通过message向子程序传递数据        Bundle b = new Bundle();        b.putInt("id", 110);        b.putString("name", "huangbiao");        msg.setData(b);        /**         * 将Message对象发送到目标对象         * 所谓的目标对象,就是生成该msg对象的handler对象         */        msg.sendToTarget();    }        class MyHandler extends Handler    {    public MyHandler()    {    }    public MyHandler(Looper looper)    {    super(looper);    }    /*     * 主线程调用下面的方法,另开辟了一个新的线程,我让这个新的线程睡眠1秒中,然后再修改主线程的UI,但是页面提示异常     * 如果不使用睡眠或者不修改主线程的UI,页面不会出现异常     * 想知道为什么休眠和修改主线程的UI有什么关系?     */    public void handleMessage(Message msg)    {    System.out.println("sub thread is :"+Thread.currentThread().getId());//    try {//Thread.sleep(1000);//} catch (InterruptedException e) {//// TODO Auto-generated catch block//System.out.println("sleep exception");//e.printStackTrace();//}    //    for(int i = 0; i < 10000000; i++){//    //    }    //获取主程序传递过来的数据    Bundle bundle = msg.getData();    int id = bundle.getInt("id");    String name = bundle.getString("name");    System.out.println("id is : " + id);    System.out.println("name is : " + name);    if(110 == id){    System.out.println("id == 110");    findViewById(R.id.textView).setVisibility(View.INVISIBLE);    }    }    }}

?

读书人网 >Android

热点推荐