简述
- Handler 处理类
- Looper 循环类,包含消息队列,包含一个循环线程
- Message 消息类
实现
- 可以发送消息,会在一个子线程中处理消息内容,需要手动调用quit停止线程工作.可以发送runnable执行任务,可以延时.
- Message类
public class Message {
public String name;
public int what;
public int arg1;
public int arg2;
public Object obj;
public Runnable runnable;
public long when;
public Handler handler;
public Message() {
this(0, null, null);
}
public Message(Runnable runnable) {
this(0, null, runnable);
}
public Message(int what) {
this(what, null, null);
}
public Message(int what, Object obj) {
this(what, obj, null);
}
public Message(int what, Object obj, Runnable runnable) {
this.what = what;
this.obj = obj;
this.runnable = runnable;
}
@Override
public String toString() {
return "Message is +" +
" name = " + name +
" what = " + what +
" arg1 = " + arg1 +
" arg2 = " + arg2;
}
}
public class Handler {
private Looper mLooper;
public Handler() {
mLooper = new Looper();
mLooper.startLoop();
}
public Handler(Looper looper) {
mLooper = looper;
mLooper.startLoop();
}
public void post(Runnable r) {
Message msg = new Message(r);
sendMessageDelayed(msg, 0);
}
public void postDelayed(Runnable r,long delayMillis) {
Message msg = new Message(r);
sendMessageDelayed(msg, delayMillis);
}
public void handleMessage(Message msg) {
}
public void sendEmptyMessage(int what) {
Message msg = new Message(what);
sendMessageDelayed(msg, 0);
}
public void sendMessage(Message msg) {
sendMessageDelayed(msg, 0);
}
public void sendMessageDelayed(Message msg, long delayMillis) {
if (delayMillis < 0) {
delayMillis = 0;
}
msg.when = System.currentTimeMillis() + delayMillis;
msg.handler = this;
mLooper.addMessage(msg);
}
public void dispatchMessage(Message msg){
if (msg.runnable != null){
msg.runnable.run();
return;
}
handleMessage(msg);
}
public Looper getLooper(){
return mLooper;
}
}
public class Looper {
private List<Message> messages = new LinkedList<>();
private Object mLock = new Object();
private boolean quitFlag = false;
private Thread mThread = new Thread() {
@Override
public void run() {
loop();
}
};
public Looper() {
}
public void startLoop() {
mThread.start();
}
public void loop() {
for (; ; ) {
if (quitFlag == true) {
return;
}
if (messages.isEmpty()) {
continue;
}
Message msg = messages.get(0);
if (msg.when > System.currentTimeMillis()) {
continue;
}
msg.handler.dispatchMessage(msg);
messages.remove(msg);
}
}
public boolean addMessage(Message msg) {
if (msg == null) {
return false;
}
if (msg.when == 0) {
msg.when = System.currentTimeMillis();
}
for (int i = 0; i < messages.size(); i++) {
if (msg.when < messages.get(i).when) {
messages.add(i, msg);
return true;
}
}
messages.add(msg);
return true;
}
public boolean quit() {
quitFlag = true;
return true;
}
}
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, ">>>>>>>>>>>>>>>>>>>>");
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
String info = (String) msg.obj;
switch (msg.what) {
case 0:
Log.d(TAG, msg.toString());
Log.d(TAG, info);
break;
case 1:
Log.d(TAG, msg.toString());
Log.d(TAG, info + " ");
break;
case 2:
Log.d(TAG, msg.toString());
Log.d(TAG, info);
break;
}
}
};
Message msg = new Message();
msg.what = 0;
msg.obj = "msg 0, delay msg";
handler.sendMessageDelayed(msg,10000);
handler.sendEmptyMessage(1);
Message msg2 = new Message(2,"msg 2");
handler.sendMessage(msg2);
Runnable runnable = new Runnable() {
@Override
public void run() {
Log.d(TAG, "quit loop");
handler.getLooper().quit();
}
};
handler.postDelayed(runnable,20000);
}
}