Looper:
先看看android SDK对looper的描述,Handler Message Looper在sdk api不好找,注意是在/android-sdk-linux/docs/reference/android/os/路径下。
Looper类用于在一条线程中运行一个消息循环,没有直接调用Looper的普通线程默认的不会关联一个消息循环。如果使线程具有消息循环,我们在该线程内需要调用Looper.prepare()使线程具备消息循环,调用Looper.loop()方法使该循环处理了消息后立即结束。注意在该线程关联的Looper没有停止前,线程一直在Looper.prepare()和Looper.loop()之间循环,知道结束了looper,才执行Looper.loop()之后的代码。
下面结合官方小demo写出一个好理解的小demo
demo
-
package com.vibexie.handlermessagelooper;
-
-
import android.os.Handler;
-
import android.os.Looper;
-
import android.os.Message;
-
import android.support.v7.app.ActionBarActivity;
-
import android.os.Bundle;
-
import android.view.Menu;
-
import android.view.MenuItem;
-
import android.view.View;
-
import android.widget.Button;
-
-
-
public class MainActivity extends ActionBarActivity {
-
private Button button;
-
private Button button2;
-
public Handler mHandler;
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
-
/**
-
* 启动线程,要格外注意的是:本demo为什么要使用button来向mHandler发送message,而不直接启动线程后,主线程立即向mHandler发送消息,
-
* 原因就是不能立即向mHander发送消息,因为启动线程需要一定的时间,立即发送消息的话,mHander可能还没有初始化,会出现空指针异常。
-
* ,你也可以不用button,可以先使主线程休眠一定时间,注意小于ANR时间,mHandler发送消息也是可以的,理解android编程,这一点很重要。
-
*/
-
new LooperThread().start();
-
-
button=(Button)this.findViewById(R.id.button);
-
button2=(Button)this.findViewById(R.id.button2);
-
-
/**
-
* 点击button向Handler发送1
-
*/
-
button.setOnClickListener(new View.OnClickListener() {
-
@Override
-
public void onClick(View v) {
-
mHandler.obtainMessage(1).sendToTarget();
-
}
-
});
-
-
/**
-
* 点击button向Handler发送2,要求线程结束Looper
-
*/
-
button2.setOnClickListener(new View.OnClickListener() {
-
@Override
-
public void onClick(View v) {
-
mHandler.obtainMessage(2).sendToTarget();
-
}
-
});
-
}
-
-
/**
-
* Looper
-
*/
-
class LooperThread extends Thread {
-
public void run() {
-
-
Looper.prepare();
-
-
mHandler = new Handler() {
-
public void handleMessage(Message msg) {
-
// process incoming messages here
-
if(msg.what==1){
-
System.out.println("---->>Looper中");
-
}
-
-
if(msg.what==2){
-
System.out.println("---->>结束Looper");
-
/**
-
* 停止该线程关联的Looper,注意调用Looper的非静态方法,需要先获取Looper实例,如quit就是一个非静态方法
-
*/
-
Looper.myLooper().quit();
-
}
-
}
-
};
-
-
/**
-
* 线程一直循环运行Looper.prepare()与Looper.loop()之间的代码
-
*/
-
Looper.loop();
-
-
/**
-
* 注意该线程关联的Looper停止后,也就是在Looper中调用了Looper.myLooper().quit(),线程才调用之后的代码
-
*/
-
System.out.println("---->>Looper外");
-
}
-
}
- }
运行结果如下(点击button,输出“---->>Looper中”,点击button2输出:"---->>结束Looper"和"---->>Looper外"):

可以看见,停止了Looper,就运行Looper.loop()之后的代码,最后退出线程,线程也就结束了。
看了这个demo,想必你又对Looper有了新的认识。对于Looper其它的方法,可以参看sdk文档:/docs/reference/android/os/Looper.html