文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

AndroidHandler消息传递机制

2022-12-16 12:00

关注

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯