Handler

android 只有主线程可以更新UI。

service与activity同属一个线程。他们都在主线程工作。耗时的操作必须放在线程运行。但是service跟activity可以同时申请handler来处理消息。

1.service activity全在主线程实例化handler

handler=new Handler(){
			@Override
			public void handleMessage(Message msg) {
				// TODO Auto-generated method stub
				super.handleMessage(msg);
				if(msg.what==0){
				//	Toast.makeText(MainActivity.this, msg.obj.toString()+Thread.currentThread().getName(), Toast.LENGTH_SHORT).show();
					Log.v("LOG", "我是Activity:"+msg.obj.toString()+Thread.currentThread().getName());
					text.setText("我是Activity:"+msg.obj.toString()+Thread.currentThread().getName());
				}
			}
		};

 

		handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				// TODO Auto-generated method stub
				super.handleMessage(msg);
				if (msg.what == 0) {
					Toast.makeText(Services.this, msg.obj.toString()+Thread.currentThread().getName(),
							Toast.LENGTH_SHORT).show();
					Log.v("LOG", "我是服务:"+msg.obj.toString()+Thread.currentThread().getName());
				}
			}
		};

 2.在线程中实例化handler分为涉及UI以及不涉及UI两种情况

1.不涉及UI可以自己申请自己的消息队列

 

        new Thread() {
            public void run() {
                Looper.prepare();
                threadhandler = new Handler() {
                    public void handleMessage(Message msg) {
                        if (msg.what == 0) {
                            text.setText("我是线程:" + msg.obj.toString()
                                    + Thread.currentThread().getName());
                            // Toast.makeText(MainActivity.this,
                            // msg.obj.toString()+Thread.currentThread().getName(),
                            // Toast.LENGTH_SHORT).show();
                            Log.v("LOG", "我是线程:" + msg.obj.toString()
                                    + Thread.currentThread().getName());
                        }
                    };
                };
                Looper.loop();
            }
        }.start();

Looper.prepare();  Looper.loop();两个重要的声明,申请独立的消息泵消息推队列。

2.涉及UI仍然需要主线程的消息泵处理

        new Thread() {
            public void run() {
            //    Looper.prepare();
                threadhandler = new Handler(getMainLooper()) {
                    public void handleMessage(Message msg) {
                        if (msg.what == 0) {
                            text.setText("我是线程:" + msg.obj.toString()
                                    + Thread.currentThread().getName());
                            // Toast.makeText(MainActivity.this,
                            // msg.obj.toString()+Thread.currentThread().getName(),
                            // Toast.LENGTH_SHORT).show();
                            Log.v("LOG", "我是线程:" + msg.obj.toString()
                                    + Thread.currentThread().getName());
                        }
                    };
                };
            //    Looper.loop();
            }
        }.start();

getMainLooper(); 申请主线程的消息泵

可能还涉及到post 也是同样的道理。

posted on 2013-03-13 14:14  _star  阅读(180)  评论(0)    收藏  举报

导航