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();
}

}

运行如下:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值