Handler
今天我学习了Handler,下面我们通过五大模块来了解下handler相关内容(有错误帮忙点出来,谢谢大家。我的理解还很片面和浅薄!)
一、什么是handler?
handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息。
二.什么是Looper和messageQueue?
大家都知道handler的作用有两个,发送消息和处理消息。而handler发送的消息必须被送到指定MessageQueue(消息队列)中,也就是说,如果想让handler正常工作,就必须有一个MessageQueue(消息队列),不过MessageQueue(消息队列)是由Looper来关系。所以也可以说想让handler正常工作,必须在当前线程中有一个Looper对象。(请认真读)
总结:
Looper:每个线程只有一个Looper,相当于是利用消息队列的方式 ,他负责管理MessageQueue,会不断的从MessageQueue取出消息,分发给对象的handler。
MessageQueue为消息队列,用来储存各个子线程的消息。
三.什么是Message?
Message(消息)类是通信内容的载体。线程间的通信包含哪些数据等等信息,都是由Message来保存。通常对Message对象不是直接new出来的,只要调用handler中的obtainMessage方法来直接获得Message对象。
属性字段:arg1、arg2、what、obj、其中arg1和arg2是用来存放整型数据的;what是用来保存消息标示的;obj是Object类型的任意对象;
*
四. 如何使用handler?
- 在UI线程中创建Handler匿名内部类对象;
- 在匿名内部类中重写HandleMessage方法;
- 在UI线程中启动子线程;
- 在线程中获得Message对象;
- 将需要传递的message赋值到message中;
- 通过Handler对象的sendMessage方法发送消息到消息队列中;
-
在handleMessage方法中接受消息。
五.倒计时案例举例:
之前讲的已经都说了,这我就直接贴代码了:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="com.example.administrator.myapp.Main2Activity">
<EditText
android:id="@+id/shuru"
android:layout_width="match_parent"
android:layout_height="40dp" />
<TextView
android:id="@+id/tv_time"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/shuru"
android:textSize="30sp"
/>
<Button
android:id="@+id/btn_begin"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:text="start" />
</RelativeLayout>
Activity中代码:
package com.example.administrator.myapp;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Main2Activity extends AppCompatActivity {
private EditText shuru;
private Button btn_begin;
private TextView tv_time;
int time;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
tv_time.setText(msg.what+"");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
btn_begin = (Button) findViewById(R.id.btn_begin);
tv_time = (TextView) findViewById(R.id.tv_time);
shuru=findViewById(R.id.shuru);
btn_begin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
time=Integer.parseInt(shuru.getText().toString());
new Thread(new Runnable() {
@Override
public void run() {
for(int i=time;i>0;i--){
handler.sendEmptyMessage(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
});
}}
推荐阅读
-
Android中AsyncTask与handler用法实例分析
-
Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)
-
Android Handler leak分析及解决办法详解
-
SharePoint 2007图文开发教程(5) 体验Event Handler
-
AsyncTask陷阱之:Handler,Looper与MessageQueue的详解
-
深入Android Handler与线程间通信ITC的详解
-
Android Handler之消息循环的深入解析
-
Android中handler使用浅析
-
Android开发笔记 Handler使用总结
-
Android开发笔记之:Handler Runnable与Thread的区别详解