解析
数据中处理消息不是单独的,而是以下的关系,一个线程对应一个Looer,一个Looer对应一个MessageQueue,而MessageQueue中多个Message,Message是通过handler添加而来,每次都是进入到MessageQueue的队尾,而每次是通过Looper进行取出队首的Message交给handler进行处理
Looer一直等待MessageQueue的Messagee加入并提交给handler处理
Message携带数据
内置的5个属性
如下是内置的5个属性,其中what属性是自定义的消息代码,一般用整型或者是十六进制数进行标识
arg1、arg2属性一般用来存整型数等
Message对象创建
一般使用以下两个方法获取Message对象,而不使用new Message,因为new会每次创建信息的对象,对内存没有合理利用
总结
实例
1、实现轮播图
2、activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ViewFlipper
android:layout_width="match_parent"
android:layout_height="400dp"
android:id="@+id/viewflipper"
></ViewFlipper>
</LinearLayout>
3、MainActivity.java
package com.example.lunbo_page;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ViewFlipper;
public class MainActivity extends AppCompatActivity {
public int[] imgs = new int[]{R.drawable.img01, R.drawable.img02, R.drawable.img03, R.drawable.img04};
private int FLAG_MSG = 0x011;
ViewFlipper viewFlipper;
Message message;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewFlipper = findViewById(R.id.viewflipper);
for(int i = 0 ; i < imgs.length ; i++){
ImageView imageView = new ImageView(MainActivity.this);
imageView.setImageResource(imgs[i]);
viewFlipper.addView(imageView);
}
viewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.slide_in_left));
viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.slide_out_right));
// 创建Message对象
message = Message.obtain();
message.what = FLAG_MSG;
handler.sendMessage(message);
}
Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if(msg.what == FLAG_MSG){
viewFlipper.showNext();
message = handler.obtainMessage(FLAG_MSG);
// 延迟3秒发送,如此形成循环,从而形成轮播效果
handler.sendMessageDelayed(message, 3000);
}
}
};
}