Handler处理长时间事件

当我们在处理一些比较长时间的事件时候,比如读取网络或者数据库的数据时候,就要用到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>

最后运行图片如下:

 

posted @ 2016-06-21 09:22  星辰之力  阅读(1731)  评论(0编辑  收藏  举报