Handler的使用
1、handler是用来控制线程的,当要处理大规模数据时如下载文件时,可能耗时很久,程序出现假死,所用handler去控制另外的线程
2、首先要生成对象 Handler handler = new Handler()
3、然后把新的线程(这里名为updateThread)加入到线程队列 handler.post(updateThread); 然后就不用管这个线程了,主线程继续
运行
4、如何产生新线程,可以实现Runnable 接口
//将要执行的操作写在线程对象的run方法当中
Runnable updateThread = new Runnable()
{
@Override
public void run()
{
...//操作
}
};
十一、handler和Message类的使用
1、handler 可以使用 Message来传输数据,
2、Message 把参数压入到消息队列中,然后handler会处理消息队列中消息
3、首先要用Handler的对象handler(名字随意)来获得Message类的对象,Message msg = handler.obtainMessage();
4、Message有两个参数,arg1,arg2,他们是int,这是最简单的使用,对参数赋值 Msg.arg1=100;
5、然后用handler.sendMessage(msg),把消息对象发送到消息队列
6、使用handler的handleMessage(Message msg)来处理消息,可以在定义Handler对象时同时用匿名类的方式重写该方法
Handler handler = new Handler(){
//重写处理消息队列中消息的方法
@Override
public void handleMessage(Message msg)
{
...//处理操作
}
};
=========================关键代码==============================================
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
package mars.barhandler; 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; public class TestBarHandler extends Activity { /** Called when the activity is first created. */ //声明控件变量 ProgressBar bar = null; Button startButton = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //根据控件的ID得到代表控件的对象,并为按钮设置监听器 bar = (ProgressBar)findViewById(R.id.bar); startButton = (Button)findViewById(R.id.startButton); startButton.setOnClickListener(new ButtonListener()); } //当点击startButton按钮时,就会执行ButtonListener的onClick方法 class ButtonListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub bar.setVisibility(View.VISIBLE); updateBarHandler.post(updateThread); } } //使用匿名内部类来复写Handler当中的handleMessage方法 Handler updateBarHandler = new Handler(){ @Override public void handleMessage(Message msg) { bar.setProgress(msg.arg1); updateBarHandler.post(updateThread); } }; //线程类,该类使用匿名内部类的方式进行声明 Runnable updateThread = new Runnable(){ int i = 0 ; @Override public void run() { i = i + 10 ; //得到一个消息对象,Message类是有Android操作系统提供 Message msg = updateBarHandler.obtainMessage(); //将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少 msg.arg1 = i ; try { //设置当前显示睡眠1秒 Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //将msg对象加入到消息队列当中 updateBarHandler.sendMessage(msg); if( i == 100){ //如果当i的值为100时,就将线程对象从handler当中移除 updateBarHandler.removeCallbacks(updateThread); } } }; }
==========================================================================
|