什么是handler?
handler主要用在用户同自己创建的线程进行通信,andorid应用程序在主线程中会维护一个消息队列,通过Message对象在线程间进行通信.在handler内部的handlerMessage中处理消息请求
其实学习过VC++的朋友应该可以很好的理解handler,类似于VC++中的消息处理
Message对象都都存储了什么?
一共有4个参数,arg1,arg2,obj,what
arg1和arg2 是int类型,可以通过成员方法setData和getData访问进行修改
obj ,object类型,可以存储任意类型,比如放一个对象,一个int值,也就是消息中的附加数据
what,int类型,就是用户定义的消息类型码,可以通过what判断是什么消息
我们来做个例子,这个例子有一个TextView显示进度和完成及停止的内容,一个ProgressBar来显示进度,两个Button,用于开始和停止
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.ssln.handler.MainActivity" > <TextView android:id="@+id/tvMsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" /> <ProgressBar android:id="@+id/progbar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/btnstart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" /> <Button android:id="@+id/btnstop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止" /> </LinearLayout> </LinearLayout>
MainActivity.java
package com.ssln.handler; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; public class MainActivity extends Activity { private final int UPDATEMSG = 1; // 更新消息类型 private final int COMPLETEMSG=2; // 完成消息 private final int STOPMSG=3; // 停止消息 private final int MAXVALUE = 100; // ProgressBar最大值 private boolean isStop=false; //是否停止 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView tvMsg = (TextView) findViewById(R.id.tvMsg); final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progbar); Button btnstart = (Button) findViewById(R.id.btnstart); Button btnstop=(Button)findViewById(R.id.btnstop); // 设置最大值 progressBar.setMax(MAXVALUE); // 初始化一个handler,用于更新textview和progressBar final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch(msg.what) { case UPDATEMSG: tvMsg.setText(msg.obj.toString() + "%"); progressBar .setProgress(Integer.valueOf(msg.obj.toString())); break; case COMPLETEMSG: tvMsg.setText("完成了更新操作"); break; case STOPMSG: tvMsg.setText("停止了更新操作"); break; } } }; //停止操作 btnstop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { isStop=true; } }); //开始 使用BUTTON来创建一个新线程,来更新数据 btnstart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new Thread() { public void run() { Message msg; for (int i = 0; i < MAXVALUE; i++) { if(isStop) { break; } // 循环发送消息,实现内部通信 msg = new Message(); msg.what = UPDATEMSG; msg.obj = i + 1; handler.sendMessage(msg); try { // 睡眠一段时间 Thread.sleep(150); } catch (InterruptedException e) { e.printStackTrace(); } } if(!isStop) { //发送完成消息 msg = new Message(); msg.what =COMPLETEMSG ; handler.sendMessage(msg); } else { //发送停止消息 msg = new Message(); msg.what =STOPMSG ; handler.sendMessage(msg); isStop=false; } } }.start(); } }); } }
当点击开始按钮后,每间隔150毫秒,会发送一个updatemsg,其中的obj为当前的进度值,进度条设置进度为obj,textview会显示百分比
当进度到达100%的时候,会发送一个COMPLETEMSG 完成消息,用于TextView更新显示
如果在更新过程中,点击了停止,那开始的线程中就会跳出循环,并发送一个 STOPMSG 停止消息