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
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); } } } }
相关文章推荐
- 我的Android应用学习笔记(四)Handler相关
- android Handler 机制研究学习笔记
- Android开发学习笔记-7 Handler基础
- Android开发学习笔记(8):浅谈Handler实现多线程和异步处理
- Android Handler学习笔记
- android Handler 机制研究学习笔记
- Android 学习笔记 - 【Handler】
- Android 学习笔记 二十二 之Handler
- android Handler 机制研究学习笔记
- Android应用开发学习笔记之多线程与Handler消息处理机制
- android handler学习笔记
- android Handler 机制研究学习笔记
- Android Handler的使用(二) 学习笔记
- Android之okHttpClient+handler+LruCache缓存网络图片学习笔记(通用MVP模式)
- Android(java)学习笔记134:Handler用法总结和秒表案例
- 【Android】学习笔记(5)——浅谈Handler
- 笔记:学习 Android -Handler,Thread,Looper
- android Handler 机制研究学习笔记
- Android(java)学习笔记149:AsyncTask(异步任务)和Handler(消息机制)
- Android 学习笔记 Thread (二) android线程 Handler,AsyncTask例