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

Android 开发笔记—— Handler与异步

2011-04-21 16:30 363 查看
     在开发中,有这样一个应用场景,我们做的Android程序需要每次运行前,通过网络,检查有没有最新版本。这功能目前很多软件都有,这时候检查有没有新版本,会是后台运行的一个异步任务。使用Handler我们可以到达这一效果。



     但是创建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的线程上运行。
    到此文章开头的场景也就满足了。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息