Android 开发笔记—— Handler与异步
2011-04-21 16:30
363 查看
在开发中,有这样一个应用场景,我们做的Android程序需要每次运行前,通过网络,检查有没有最新版本。这功能目前很多软件都有,这时候检查有没有新版本,会是后台运行的一个异步任务。使用Handler我们可以到达这一效果。
但是创建Handler并不是创建一个用于异步的线程,相反,Handler会绑定在创建它的对象所占用的线程之上。就是说,Handler和创建Handler的对象公用一个线程,为了证明我们的想法,请看看项目的代码:
程序中longTimeWork模拟了一个需要五秒运行的时间的任务,但程序运行后,我们可以看到“Welcome”会在程序运行后大约五秒后才出现,而我们在两个地方打印出来的Thread ID都是一样的(图一)。这足够证明我们的猜想,而且在API中,也可以证实我们的猜想。
(图一)
这明显不能满足文章开头所描述的应用场景的需要,我们必须寻找解决方法。尝试修改代码:
(图二)
这次情况不一样了,“Welcome”会马上显示,而且,打印的Thread ID也不一样了(图二)。我这里创建了HandlerThread,这个类是用来创建一条新线程而这个类含有一个Looper,这个Looper可以用来创建Handler,这样创建的Handler在HanderThread的线程上运行。
到此文章开头的场景也就满足了。
但是创建Handler并不是创建一个用于异步的线程,相反,Handler会绑定在创建它的对象所占用的线程之上。就是说,Handler和创建Handler的对象公用一个线程,为了证明我们的想法,请看看项目的代码:
; ruler: true]package com.example; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.provider.Settings; import android.widget.TextView; public class HandlerActivity extends Activity { TextView welcomeTxt; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); welcomeTxt = (TextView) findViewById(R.id.txtView); MyHandler myHandler = new MyHandler(); myHandler.post(longTimeWork); //because myHandler and HandlerActivity are in the same thread, so android should finish longTimeWork first //And then the welcome message will appear. welcomeTxt.setText("Welcome!"); } private class MyHandler extends Handler{ public MyHandler(){ } public MyHandler(Looper looper){ super(looper); } @Override public void handleMessage(Message msg) { Bundle b = msg.getData(); int age = b.getInt("age"); String name = b.getString("name"); System.out.println("age is " + age + ", name is" + name); System.out.println("Handler--->" + Thread.currentThread().getId()); System.out.println("handlerMessage"); } } private Runnable longTimeWork = new Runnable() { public void run() { System.out.println("I will cost long time!"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } }; }
程序中longTimeWork模拟了一个需要五秒运行的时间的任务,但程序运行后,我们可以看到“Welcome”会在程序运行后大约五秒后才出现,而我们在两个地方打印出来的Thread ID都是一样的(图一)。这足够证明我们的猜想,而且在API中,也可以证实我们的猜想。
(图一)
这明显不能满足文章开头所描述的应用场景的需要,我们必须寻找解决方法。尝试修改代码:
package com.example; import android.app.Activity; import android.os.*; import android.provider.Settings; import android.widget.TextView; public class HandlerActivity extends Activity { TextView welcomeTxt; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); welcomeTxt = (TextView) findViewById(R.id.txtView); System.out.println("Thread ID in HandlerActivity:"+Thread.currentThread().getId()); HandlerThread handlerThread = new HandlerThread("new Thread"); handlerThread.start(); MyHandler myHandler = new MyHandler(handlerThread.getLooper()); myHandler.post(longTimeWork); //because myHandler and HandlerActivity are in the same thread, so android should finish longTimeWork first //And then the welcome message will appear. welcomeTxt.setText("Welcome!"); } private class MyHandler extends Handler{ public MyHandler(){ } public MyHandler(Looper looper){ super(looper); } @Override public void handleMessage(Message msg) { } } private Runnable longTimeWork = new Runnable() { public void run() { System.out.println("I will cost long time!"); try { System.out.println("Thread ID in longTimeWork:"+Thread.currentThread().getId()); Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } }; }
(图二)
这次情况不一样了,“Welcome”会马上显示,而且,打印的Thread ID也不一样了(图二)。我这里创建了HandlerThread,这个类是用来创建一条新线程而这个类含有一个Looper,这个Looper可以用来创建Handler,这样创建的Handler在HanderThread的线程上运行。
到此文章开头的场景也就满足了。
相关文章推荐
- Android开发学习笔记(8):浅谈Handler实现多线程和异步处理
- Android开发学习笔记十四 异步线程之Handler
- Android开发:Handler异步通信机制全面解析(包含Looper、Message Queue)
- Android开发:Handler异步通信机制全面解析(包含Looper、Message Queue)
- Android开发笔记: Runnable,Handler ,Thread的使用方法
- Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验
- android开发教程之handler异步更新ui
- Android开发笔记之:Handler Runnable与Thread的区别详解
- Android开发笔记之:Handler Runnable与Thread的区别详解
- Android开发学习笔记-7 Handler基础
- Android应用开发学习笔记之多线程与Handler消息处理机制
- android开发笔记之网络编程—异步加载(AsyncTask)
- Android 异步开发之 AsyncQueryHandler
- Android 开发笔记—— Handler的使用
- Android(java)学习笔记149:AsyncTask(异步任务)和Handler(消息机制)
- Android开发笔记之:Handler Runnable与Thread的区别详解
- Android应用开发学习笔记之多线程与Handler消息处理机制
- Android 异步开发之 AsyncQueryHandler
- Android开发笔记之:Handler Runnable与Thread的区别详解
- Android开发笔记之:Handler Runnable与Thread的区别详解