您的位置:首页 > 移动开发 > Android开发

android handler学习笔记

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

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

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

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

View Code

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);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: