Android Handler消息传递机制

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Android Handler消息传递机制

上后左爱   2022-12-16 我要评论

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
    }
}

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们