android消息處理

    瞭解消息處理首先要知道MessageQueue,是消息隊列,存放消息的地方,按照FIFO規則執行,每一個線程只可以擁有一個MessageQueue。在創建Looper對象會創建一個MessageQueue對象。

     剛剛講到消息隊列,那麼一定會有消息,那現在就講Message(消息),是MessageQueue存放的對象,一個MessageQueue中可以存放多個Message對象。可以通過Message.obtain()或者Handler.obtainMessage()獲取Message對象。但是這並不是直接創建一個新的實例,而是先從消息池中看有沒有可用的Message實例,存在則直接取出返回這個實例。如果消息池中沒有可用的Message實例,則才用給定的參數創建一個Message對象。調用removeMessage時,將Message從MessageQueue中刪除,同時放入到消息池中。

然而要操作MessageQueue,則要用到Looper。一個Looper對應一個MessageQueue。通過調用Looper.myLooper()可以調用當前線程的Looper對象。Looper從MessageQueue中取出Message然後交由Handler的handleMessage()進行處理。處理完成後,調用Message.recycle()將其放入消息池中。

      那麼對於消息處理就要講到Handler了。handler負責將需要傳遞的封裝成Message對象,然後調用sendMessage()方法將消息放入MessageQueue中。當MessageQueue循環到該Message,調用相應的handler對象的handlerMessage()方法對其進行處理。Handler可以同享同一個Looper和MessageQueue。

爲了更好的瞭解Message可以多參考一下文檔。

 下面用一個實例來測試一下:

測試用例用MainActivity.java代碼如下:

package com.cooguo.handler.activity;
import com.cooguo.handler.service.ExempleService;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {

private Button btnStartService = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnStartService = (Button)findViewById(R.id.btnStartService);
        btnStartService.setOnClickListener(listener);
    }
    private OnClickListener  listener = new OnClickListener(){
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnStartService:
Intent iten = new Intent(MainActivity.this,ExempleService.class);
    startService(iten);
break;
default:
break;
}

}
    };
}

而ExempleService.java代碼如下:

package com.cooguo.handler.service;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
public class ExempleService extends Service {
private static final int COOLSZY = 1;
private static final int KUKA = 2;
private static final String TAG = "ExempleService";
private ServiceHanler hanler;
private class ServiceHanler extends Handler{
public ServiceHanler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case COOLSZY:
Log.i(TAG, "handleMessage--->"+msg.obj);
break;
case KUKA:
Log.i(TAG, "handleMessage-->"+msg.obj);
break;
default:
break;
}
stopSelf(msg.arg1);
}
}

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

@Override
public void onCreate() {

Log.i(TAG, "ExempleService-->onCreate");
Looper looper = Looper.getMainLooper();
hanler = new ServiceHanler(looper);
super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Message msg = hanler.obtainMessage();
msg.what = KUKA;
msg.arg1 = startId;
msg.obj = "kuka";
hanler.sendMessage(msg);
Log.i(TAG, "ExempleService-->onStartCommand");
return START_STICKY;
}

@Override
public void onStart(Intent intent, int startId) {
Log.i(TAG, "ExempleService-->onStart");
super.onStart(intent, startId);
}

@Override
public void onDestroy() {
Log.i(TAG, "ExempleService-->onDestroy");
super.onDestroy();
}

}

運行如下:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章