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>

 

 

posted @ 2010-01-30 20:50  Kstyjobx!!  阅读(212)  评论(0编辑  收藏  举报