导航

Android_Loop

Posted on 2017-06-16 00:32  Young哥哥  阅读(65)  评论(0)    收藏  举报

package org.mobiletrain.www.aday20_demo01_handlerlooper;

 
 

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;

 
 
 

public class MainActivity extends ActionBarActivity {

 
 

@Override

 

protected void onCreate(Bundle savedInstanceState) {

 

super.onCreate(savedInstanceState);

 

setContentView(R.layout.activity_main);

 

// Looper.prepareMainLooper();

 

// Looper.loop();

 
 
 

Handler handler=new Handler();

 

/**

 

* 1. 生成Message new|从消息池中取出

 

*

 

* 2. 将Handler添加到Message对象中 m.target = h;

 

*/

 

Message msg=handler.obtainMessage();

 

msg.what=100;

 

/**

 

* 1. 将消息添加到消息队列中 queue.enqueueMessage(msg,)

 

*

 

* 2. msg.target = this;

 

*

 

* handleMessage(msg);

 

*/

 

handler.sendMessage(msg);

 
 

/**

 

* 1. 根据 Runnable 对象生成 Message

 

* Message m = Message.obtain();

 

* m.callback = r;

 

*

 

* 2. 将Message 放入消息对象

 

*

 

* 3. Looper 中调用 Handler.handleCallback(msg);

 

* message.callback.run();

 

*/

 

handler.post(new Runnable() {

 

@Override

 

public void run() {

 

//UI

 

}

 

});

 
 

}

 
 

class MainThread extends Thread{

 
 

@Override

 

public void run() {

 

super.run();

 
 

/**

 

* 1. 初始换Looper对象 new Looper(quitAllowed)

 

*

 

* 2. 创建 MessageQueue mQueue = new MessageQueue(quitAllowed);

 

*

 

* 3. 每个线程中只有1个Looper对象 Only one Looper may be created per thread

 

*

 

* 4. 当线程有Looper对象,这个线程就可以叫 LooperTread

 

*/

 

Looper.prepare();

 
 

/**

 

* 1. 获得当前线程中的Looper对象 mLooper = Looper.myLooper();

 

*

 

* 2. 获得当前线程中的消息队列 mQueue = mLooper.mQueue;

 

*

 

*/

 

Handler handler=new Handler();

 
 

/**

 

* 1. 拿到当前线程的Looper对象 Looper me = myLooper();

 

*

 

* 2. 拿到当前线程的MessageQueue对象 MessageQueue queue = me.mQueue

 

*

 

* 3. 死循环 for (;;) {}

 

*

 

* 4. 取出消息队列中的消息,当消息队列中无消息时会阻塞线程 Message msg = queue.next(); // might block

 

*

 

* 5. 取出消息对象中的Handler对象,

 

* 调用Handler对象的dispatchMessage()处理当前消息

 

* msg.target.dispatchMessage(msg);

 

* Handler target handleMessage(msg);

 

*

 

* 6. 处理完消息,把消息放入消息池 msg.recycleUnchecked();

 

*/

 

Looper.loop();

 

}

 

}