0114 Handler(一)
如果耗时的线程放在Activity会耗死,如果放在另一个线程里,用户感觉更加好,Handler就是满足此项功能
把下载或者单独处理数据放在另一个线程里面
Activity是一个线程,处理数据或者下载文件时另一个线程
Handler是安卓操作系统所提供的一个类
线程类
JAVA实现线程有两种方法
1,继承thread类
2,实现Ruanable接口 此处用匿名内部类实现接口 ,里面实现run()方法
线程有几种状态,就绪,运行,阻塞,死亡
handler.postDelayed(updateThread,3000)
隔3000毫秒加入一次updateThread这个线程
匿名内部类的学习见 android tips 收藏网页
Handler 存在两个队列
其中一个是将线程放入的队列,线程队列,比如放入下载线程等比较耗时间的线程
另一个是将消息放入的队列,消息队列里面放的是Message对象
Message类是由 Android操作系统提供
如何得到Message对象?
Message msg=Handler对象.obtainMessage();
msg里面有arg1和arg2这个成员变量,是整形
用他们两个来传递消息,优点是系统系能消耗较少
比如用户设置某个变量int i=1;
arg就是用来传递用户定义的值给 Message中使用 msg.arg1这样就能操作消息中的变量
------------------------------------------------------------
Handler对象两个方法调入两个队列,一个是线程队列,另一个是消息队列
updateHandler.post(updateThread);这个updateThread将会被调入到线程队列中
updateHandler.sendMessage(msg); msg这个消息对象就会被加入到那个消息队列中
-----------------------------------------------------------------------
在调用 updateHandler.sendMessage(msg);时候,消息被压入到消息队列的尾部
而此消息可以被 handleMessage(Message msg)接受,handleMessage就开始往外面取出消息,取出的消息就是Message对象
Handler实现有两种
Handler handler=new Handler();
或者 在声明对象时候同时实现匿名内部类,里面复写handleMessage方法
Handler handler=new Handler()
{
@override
public void handleMessage(Message msg)
{}
};
-----------------------------------------------------------------------
代码是从上往下执行
在队列的两端
末端由sendMessage压入消息,消息可以携带很多数据,比如此处携带arg1整形数据
而头部处理是由handleMessage处理,两者是异步,注意是异步的
就如同寄信,一个寄信,一个取信
--------------------------------------------------------------------------
--------------------------------------------------------------------------
代码如下
1 import android.os.Bundle; 2 import android.os.Handler; 3 import android.os.Message; 4 import android.app.Activity; 5 import android.view.Menu; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 import android.widget.ProgressBar; 10 11 public class Activity11 extends Activity { 12 private Button startButton; 13 private ProgressBar myProgressBar; 14 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.main); 20 startButton=(Button)findViewById(R.id.startButton); 21 myProgressBar=(ProgressBar)findViewById(R.id.myProgressBar); 22 startButton.setOnClickListener(new ButtonListener()); 23 24 25 } 26 class ButtonListener implements OnClickListener 27 { 28 29 @Override 30 public void onClick(View arg0) { 31 // TODO Auto-generated method stub 32 myProgressBar.setVisibility(View.VISIBLE); 33 handler.post(updateThread);//用handler将某线程压入线程队列 34 35 36 37 } 38 39 } 40 Handler handler=new Handler(){ 41 //执行handlerMessage方法将队列另一端取出Message处理 42 @Override 43 public void handleMessage(Message msg) { 44 // TODO Auto-generated method stub 45 super.handleMessage(msg); 46 myProgressBar.setProgress(msg.arg1);//处理进度条,此处整形数据是由消息中的arg1传入的 47 handler.post(updateThread);//继续重复执行压入线程 48 49 } 50 51 }; 52 //用Runnable实现线程,创建Runnable对象,同时复写run()功能 53 //run()要写出此线程完成的具体功能,列表尾端压入Message对象,头部由handleMessage处理 54 Runnable updateThread=new Runnable(){ 55 int i=0;//只想updateThread方法时是执行run()方法,当重复使用updateThread时候,一直是该对象,所以i值是该对象全局变量 56 @Override 57 public void run() { 58 // TODO Auto-generated method stub 59 60 i=i+10; 61 Message msg=handler.obtainMessage();// 获取Message对象由handler调出 62 msg.arg1=i;//Message对象msg有 arg1和arg2用来传递用户自定义的数据给Message 63 //handler存在两个队列,一个是线程队列,另一个是消息队列 64 handler.sendMessage(msg);//对比handler.post(updateThread);此处是压入Message对象到消息队列 65 //上面压入消息,可以由handleMessage来收取,两者是异步的 66 try{ 67 Thread.sleep(1000); 68 }catch(InterruptedException e){ 69 e.printStackTrace(); 70 }; 71 72 if(i==100) 73 { 74 handler.removeCallbacks(updateThread);//默认是100如果进度条慢,则移除线程 75 } 76 77 } 78 79 }; 80 81 82 83 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 <ProgressBar 7 android:id="@+id/myProgressBar" 8 android:layout_width="fill_parent" 9 android:layout_height="100sp" 10 style="?android:attr/progressBarStyleHorizontal" 11 android:visibility="gone" 12 13 /> 14 <Button 15 android:id="@+id/startButton" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 19 /> 20 21 </LinearLayout>