編輯:關於Android編程
在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;
}
}
}
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): 我是空閒線程,我還會回來的!
miui8怎麼升級 小米MIUI 8系統更新升級教程
你的小米手機准備好迎接MIUI8的到來了嗎?今天小編搶先帶來小米MIUI 8系統更新升級教程,想要升級miui8系統的米粉們快來看看吧!MIUI8升級須知:
Android學習之動畫(1)
Android中動畫分為三種,逐幀動畫,補間動畫,屬性動畫,這篇先總結逐幀動畫和補間動畫。逐幀動畫1, 是什麼字面上理解,幀之間追逐,幀動畫是順序的播放一系列圖片,從而產
Android 5.0新特性
Android 5.0 是 Google 於 2014 年 10 月 15 日(美國太平洋時間)發布的全新 Android 操作系統,英文名為Lollipop,翻譯過來就
Android網絡編程(三)Volley用法全解析
相關文章Android網絡編程(一)HTTP協議原理Android網絡編程(二)HttpClient與HttpURLConnection前言Volley想必很多人都用過,
Android OpenGL ES零基礎系列(三):OpenGL ES的渲染管道及VertexShader與FragmentShader
前言在前2篇文章中,我們都說到著色器,且在第二篇中正式說到,這著色器只能