- handle 创建message对象,然后把message发送给Looper的 messagequeue中
- Looper轮训messagequeue,从队列中取出message,把message发送给指定的handle处理
注意点
1、线程与handle、Looper、messagequeue的对应关系;
线程:handle =1:多
线程:Looper =1:1
线程:messagequeue=1:1
2. 在UI 线程中不需要主动设置looper ,UI线程默认已经实现。如果是在子线程中,需要单独设置
3、Looper是如何区分把message发送给哪个handle
是message中有handle的引用,looper通过message取得handler
package com.zhang.demo1.utils;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
public class LooperThread extends Thread {
protected static final String TAG = "LooperThread";
private Handler handler ;
private Handler handler1 ;
@Override
public void run() {
Looper.prepare();
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
int msgType=msg.what;
switch (msgType) {
case 2:
MyLog.i(TAG, "msgType:"+msgType);
break;
default:
break;
}
}
};
handler1=new Handler(){
@Override
public void handleMessage(Message msg) {
int msgType=msg.what;
switch (msgType) {
case 3:
MyLog.i(TAG, "msgType:"+msgType);
break;
default:
break;
}
}
};
Looper.loop();
}
public Handler getHandler() {
return handler;
}
public Handler getHandler1() {
return handler1;
}
}
package com.zhang.demo1;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import com.zhang.demo1.utils.LooperThread;
import com.zhang.demo1.utils.PromptUtils;
import com.zhang.demo1.view.RippleView;
public class HandleActivity extends GaoqingBaseActivity {
private static Activity instance;
private static Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
int msgtype = msg.what;
switch (msgtype) {
case 1:
PromptUtils.showCustomToast(instance, "rv dian ji " + msgtype, Gravity.BOTTOM);
break;
default:
break;
}
};
};
private static LooperThread looperThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handle);
//handler --messageQueue -- looper
//handler 把msg或runnable发送到looper中的messageQueue队列的队尾,
//looper 循环遍历messageQueue ,从队头中获取msg ,发送给handler处理
//注意点:1、handler创建的线程中,如果是UI线程,则默认已经实现了looper 。如果是子线程,则需要自己创建looper ,不然则会抛出异常
//2、thread : handler 关系是1:多
instance = this;
looperThread=new LooperThread();
looperThread.start();
RippleView rv_bt = (RippleView) findViewById(R.id.rv_bt1);
rv_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
handler.sendEmptyMessage(1);
}
});
RippleView rv_bt2 = (RippleView) findViewById(R.id.rv_bt2);
rv_bt2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
looperThread.getHandler().sendEmptyMessage(2);
} catch (Exception e) {
e.printStackTrace();
}
}
});
RippleView rv_bt3 = (RippleView) findViewById(R.id.rv_bt3);
rv_bt3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
looperThread.getHandler1().sendEmptyMessage(3);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}