android消息机制

消息处理机制本质:一个线程开启循环模式持续监听并依次处理其他线程给它发的消息。

简单的说:一个线程开启一个无限循环模式,不断遍历自己的消息列表,如果有消息就挨个拿出来做处理,如果列表没消息,自己就堵塞(相当于wait,让出cpu资源给其他线程),其他线程如果想让该线程做什么事,就往该线程的消息队列插入消息,该线程会不断从队列里拿出消息做处理。

handler的工作原理

handler的工作主要包括消息的发送和接收过程。消息的发送可以通过post和send的一系列方法来实现,post的一系列方法最终是通过send的一系列方法实现的。

post使用案例

创建轮播的图片

package com.example.lenovo.my_handler_post;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    int images[]={R.drawable.picture_one,R.drawable.picture_two,R.drawable.picture_three,R.drawable.picture_four};
    ImageView imageView;
    Handler h=new Handler();
    int index;
    Runnable r=new Runnable() {
        @Override
        public void run() {
            index++;
            index=index%4;
            imageView.setImageResource(images[index]);
            h.postDelayed(r,1000);
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView= (ImageView) findViewById(R.id.imageView);
        h.postDelayed(r,1000);
    }
}

 

send使用案例

模拟下载完成

package com.example.lenovo.my_handler_send;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    Button button;
    TextView textview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button= (Button) findViewById(R.id.button);
        textview=(TextView)findViewById(R.id.textView);
        

    }
Handler h=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
};
public void download(View view){
    new Thread(){
        @Override
        public void run() {
            super.run();
        
     
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Message m=new Message();
            m.what=1;
            m.arg1=100;
            m.arg2=200;
        }
    }.start();
}
}

looper的工作原理

looper在android的消息机制中扮演着消息循环的角色,具体来说它就是会不停的从messagequeue中查看是否有新消息,如果有新消息就会立刻处理,否则就一直阻塞在那里。在构造方法中它会创建一个MessageQueue即消息队列,然后将当前线程的对象保存起来。

looper也是可以退出的,looper提供了quit和quitSafely来退出。

Looper最重要的一个方法是loop方法,loop方法是一个死循环,唯一跳出循环的方法是消息队列的next方法反回了null。 loop方法会调用MessageQueue的next方法来获取新消息,而next是一个阻塞操作,当没有消息时,next方法会一直阻塞在那里,这也导致loop方法一直阻塞在那里,如果next返回了消息,looper就会处理这条消息。

一个线程只能有一个looper对象。

 

点赞