Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android Handler

Android Handler消息传递机制

作者:上后左爱

Handler是一套 Android 消息传递机制,主要用于线程间通信。用最简单的话描述: handler其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message

Handler 消息传递机制

Android中每一个应用就是一个进程,Handler消息传递机制 利用JAVA中多线程的概念,比如在主界面 就是UI主线程,同时在UI界面中某个框内消息晃动就是子线程。

机制: Android中子线程不能操作主线程组件 但是场景: 必须在子线程中更新主线程的UI组件,比如下载的进度条显示,子线程复杂下载,但是告诉主线程下载进度条 所以可以使用Handler机制

作用:

1. 在任意的线程中发送消息

2. 在主线程中获取并且 处理消息

// 如何使用Handler周期性的更新消息,比如进度条
package com.example.myapplication;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
// 从手机的通讯录中获取信息
public class MainActivity extends AppCompatActivity {
    final int TIME = 60;    //定义时间长度
    final int TIMER_MSG = 0x001;    //定义消息代码
    private ProgressBar timer;    //声明水平进度条
    private int mProgressStatus = 0;    //定义完成进度
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        timer = (ProgressBar) findViewById(R.id.timer);
        // 3. 启动进度条
        handler.sendEmptyMessage(TIMER_MSG);
    }
    //创建Handler对象实现1秒中更新一次进度
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(TIME - mProgressStatus > 0){
                mProgressStatus +=1;
                timer.setProgress(TIME-mProgressStatus);
                // 通过消息代码进行子线程识别
                handler.sendEmptyMessageDelayed(TIMER_MSG,1000);
            }else{
                Toast.makeText(MainActivity.this, "时间到!游戏结束!", Toast.LENGTH_SHORT).show();         //提示时间已到
            }
        }
    };
}

Handler Looper MessageQueue关系

Handler 与Looper 中MessageQueue 之间通过Message进行交互

Message是Handler 与Looper 之间交互的桥梁

Message: 对象属性 :

1. Int 整形

2.obj Object类型

3.replyTo 发送到何处 what 自定义的

Message.Obatin()

Handler.obtainMessage() 实现 这两个对象避免创造多余对象 导致对象的消息 Message 对象可以循环利用

package com.example.myapplication;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.widget.ViewFlipper;
import androidx.appcompat.app.AppCompatActivity;
// 从手机的通讯录中获取信息
public class MainActivity extends AppCompatActivity {
    final int FLAG_MSG = 0x001;    //定义要发送的消息代码
    private ViewFlipper flipper;   //定义ViewFlipper
    private Message message;        //声明消息对象
    //定义图片数组
    private int[] images = new int[]{R.drawable.img1, R.drawable.img2, R.drawable.img3,
            R.drawable.img4, R.drawable.img5, R.drawable.img6, R.drawable.img7, R.drawable.img8};
    private Animation[] animation = new Animation[2];  //定义动画数组,为ViewFlipper指定切换动画
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        flipper = (ViewFlipper) findViewById(R.id.viewFlipper);  //获取ViewFlipper
        for (int i = 0; i < images.length; i++) {      //遍历图片数组中的图片
            ImageView imageView = new ImageView(this);  //创建ImageView对象
            imageView.setImageResource(images[i]);  //将遍历的图片保存在ImageView中
            flipper.addView(imageView);             //加载图片
        }
        //初始化动画数组
        animation[0] = AnimationUtils.loadAnimation(this, R.anim.slide_in_right); //右侧平移进入动画
        animation[1] = AnimationUtils.loadAnimation(this, R.anim.slide_out_left); //左侧平移退出动画
        flipper.setInAnimation(animation[0]);   //为flipper设置图片进入动画效果
        flipper.setOutAnimation(animation[1]);  //为flipper设置图片退出动画效果
        // 开启广告轮播 主线程中
        message = Message.obtain();
        message.what = FLAG_MSG;
        handler.sendMessage(message);
    }
    //创建Handler对象实现1秒中更新一次进度
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == FLAG_MSG) {
                flipper.showPrevious();                  //示下一张图片
            }
            message = handler.obtainMessage(FLAG_MSG);   //获取要发送的消息
            handler.sendMessageDelayed(message, 3000);  //延迟3秒发送消息
        }
    };
}

Looper 使用

Handler 在主线程中创建 自动帮我们创建Looper对象

如果在子线程中创建 Handler 中 LooperThread

1. 子线程中创造Handler

2. 初始化Looper对象 Looper.prepare()

3.new Handler()

4.looper.loop

package com.example.myapplication;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
public class LooperThread extends Thread {
    public Handler handler;					//声明一个Handler对象
    @Override
    public void run() {
        super.run();
        //初始化Looper对象
        Looper.prepare();
        //实例化一个Handler对象
        handler = new Handler() {
            public void handleMessage(Message msg) {
                Log.i("Looper", String.valueOf(msg.what));
            }
        };
        Message m=handler.obtainMessage();	//获取一个消息
        m.what=0x7;						//设置Message的what属性的值
        handler.sendMessage(m);			//发送消息
        Looper.loop();						//启动Looper
    }
}

到此这篇关于Android Handler消息传递机制的文章就介绍到这了,更多相关Android Handler内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文