Android Handler消息传递机制
上后左爱 人气:0Handler 消息传递机制
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 } }
加载全部内容