您的位置:首页 > 其它

Handler后台空闲线程IdleHandler

2014-03-10 10:24 169 查看
转载请注明出处:http://blog.csdn.net/droyon/article/details/20903047

在Android中,我们可以处理Message,这个Message我们可以立即执行也可以delay 一定时间执行。Handler线程在执行完所有的Message消息,它会wait,进行阻塞,知道有心的Message到达。如果这样子,那么这个线程也太浪费了。MessageQueue提供了另一类消息,IdleHandler。

案例代码下载

IdleHandler在Handler空闲时执行,下面来看案例代码:

MainActivity.java

package com.example.testhandler;

import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

private Handler mHandler;

private int mWhat = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mHandler = new Handler(){

@Override
public void handleMessage(Message msg) {
Log.d("hlwang", "我在执行,你想回来,我用平底锅打飞你!");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
super.handleMessage(msg);
}

};

Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
for(int i=0;i<10;i++){
mHandler.sendEmptyMessage(mWhat);
}
}
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
protected void onResume() {
super.onResume();

Looper.myQueue().addIdleHandler(new MyIdleOnce());
Looper.myQueue().addIdleHandler(new MyIdleKeep());

}

class MyIdleKeep implements MessageQueue.IdleHandler{
/**
*返回值为true,则保持此Idle一直在Handler中,否则,执行一次后就从Handler线程中remove掉。
*/
@Override
public boolean queueIdle() {
Log.d("hlwang","我是空闲线程,我还会回来的!");
return true;
}

}

class MyIdleOnce implements MessageQueue.IdleHandler{

@Override
public boolean queueIdle() {
Log.d("hlwang","我是初恋,我只在你的生命中出现一次,我发誓,你会想我的!");
return false;
}

}
}


此Activity有两个IdleHandler消息,我们执行此Activity时,MyIdleKeep消息和MyIdleOnce会依次执行。如果IdleHandler的queueIdle方法返回false,那么IdleHandler执行完,就会从IdleHandler移除。

Log输出如下:

03-10 10:11:29.556: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:29.556: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:29.556: D/hlwang(21985): 我是初恋,我只在你的生命中出现一次,我发誓,你会想我的!
03-10 10:11:29.556: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:29.576: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:29.576: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:29.576: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:30.396: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:30.396: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:30.396: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:32.276: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:32.276: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:32.276: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:32.326: D/hlwang(21985): 我在执行,你想回来,我用平底锅打飞你!
03-10 10:11:34.386: D/hlwang(21985): 我在执行,你想回来,我用平底锅打飞你!
03-10 10:11:36.396: D/hlwang(21985): 我在执行,你想回来,我用平底锅打飞你!
03-10 10:11:38.386: D/hlwang(21985): 我在执行,你想回来,我用平底锅打飞你!
03-10 10:11:40.396: D/hlwang(21985): 我在执行,你想回来,我用平底锅打飞你!
03-10 10:11:42.386: D/hlwang(21985): 我在执行,你想回来,我用平底锅打飞你!
03-10 10:11:44.396: D/hlwang(21985): 我在执行,你想回来,我用平底锅打飞你!
03-10 10:11:46.436: D/hlwang(21985): 我在执行,你想回来,我用平底锅打飞你!
03-10 10:11:48.436: D/hlwang(21985): 我在执行,你想回来,我用平底锅打飞你!
03-10 10:11:50.446: D/hlwang(21985): 我在执行,你想回来,我用平底锅打飞你!
03-10 10:11:52.696: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:52.696: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:52.696: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:52.796: D/hlwang(21985): 我是空闲线程,我还会回来的!
03-10 10:11:52.796: D/hlwang(21985): 我是空闲线程,我还会回来的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息