您的位置:首页 > 产品设计 > UI/UE

在非UI线程中使用Handler实现请求队列

2012-08-28 18:29 489 查看
Handler是Android中非常重要的类之一,通过Handler可以实现主线程的延时操作和线程之间的通信,通过在子类中的Handle、和Looper可以很轻松的实现一个请求队列。

在写代码之前首先简要的说一下 Handler、Looper、MessageQuene之间的关系。

每一个线程最多有一个Looper、一个Looper里边含有一个MessageQuene。

Handler每次将消息发送到MessageQuene中,Looper用过一个死循环不断的从MessageQuene中获取消息,获取后,根据Message的target分发给对应的Handler进行处理。

下边是我写的一个通过Handler和Looper实现的请求队列:

package com.hou.looper;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;

public class DemoLooperActivity extends Activity {
private MyThread myThread = new MyThread();

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

/*********** 模拟两个任务 ***********/
postToNoneUIThread(new Runnable() {

@Override
public void run() {
try {
Log.e("", "5 start");
Thread.sleep(5000);
Log.e("", "5 end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
postToNoneUIThread(new Runnable() {

@Override
public void run() {
try {
Log.e("", "1 start");
Thread.sleep(1000);
Log.e("", "1 end");
} catch (InterruptedException e) {
e.printStackTrace();
}

}
});
/*********** 模拟两个任务OVER ***********/

}

public void runOnNoneUIThread(Runnable r) {
new Thread(r).start();
}

/**
* 放入到子线程队列中
* */
public void postToNoneUIThread(Runnable r) {
// 执行到这里的时候,子线程可能尚未启动,等待子线程启动,等待的时间会很短,
while (myThread.handler == null) {
}
myThread.handler.post(r);
myThread.handler.sendEmptyMessage(100);
}

/**
* 可以设计为网络请求队列
* */
class MyThread extends Thread {
{
start(); // 类加载完成后直接启动
}
private Handler handler;

@Override
public void run() {
while (true) {

Looper.prepare(); // 创建该线程的Looper对象
handler = new Handler(Looper.myLooper()) {
public void handleMessage(android.os.Message msg) {
Log.i("handleMessage", "" + msg.what);
};
};

Looper.loop(); // 这里是一个死循环
// 此后的代码无法执行
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐