当我们在处理一些比较长时间的事件时候,比如读取网络或者数据库的数据时候,就要用到Handler,有时候为了不影响用户操作应用的流畅还要开多一个线程来区别UI线程,在新的线程里面处理长时间的操作。开发的时候遇到数据处理都可以这样用handler,灵活修改一下就可以做各种效果了。
第一步:ProgressDialog弹出旋转框来提示长时间操作。
第二步:开多一个线程处理长时间操作,这里让线程睡觉10秒。
第三部:长时间操作结束后给handler发送一个消息,可以是一个整数,如果这个Activity有多个handler,可以定义多个整数成员变量来区别不同的消息。
第四步:在定义Handler的handlerMessage方法里面把ProgressDialog对象dismiss()掉,把弹出框消灭表示操作完成。
代码如下:
public class Android_HandlerActivity extends Activity { /** Called when the activity is first created. */ //声明变量 private Button b1; private ProgressDialog pd; //定义handler对象 private Handler handler = new Handler(){ //当有消息发送出来的时候就执行Handler的这个方法 @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); //只要执行到这里就关闭对话框 pd.dismiss(); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //Resources res = this.getResources(); //查看UI组件所在的线程名 Log.i("tag", "onCreate()-->"+Thread.currentThread().getName()); //定义UI组件 b1= (Button)findViewById(R.id.Button01); //给按钮绑定单击事件监听器 b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //点击按钮后去处理长耗时操作 processThread(); } }); } protected void processThread() { // TODO Auto-generated method stub //构建一个下载进度条 pd= ProgressDialog.show(Android_HandlerActivity.this, "下载文件", "正在下载……"); Log.i("tag", "processThread()-->"+Thread.currentThread().getName()); new Thread(){ @Override public void run() { Log.i("tag", "run()-->"+Thread.currentThread().getName()); //在新线程里执行长耗时方法 longTimeMethod(); //执行完毕后给handler发送一个空消息 handler.sendEmptyMessage(0); } }.start(); } //模拟下载文件的长耗时方法 protected void longTimeMethod() { // TODO Auto-generated method stub try { Log.i("tag", "longTimeMethod-->"+Thread.currentThread().getName()); Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } }
main.xml只是一个简单的Button:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/Button01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>
最后运行图片如下: