您的位置:首页 > 移动开发 > Android开发

Android学习指南之二十七:如何使用Handler

2012-09-07 23:52 701 查看
当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。

下面我们通过一个模拟文件下载的这个长耗时操作来做个说明:

1、新建一个项目Lesson27_Handler。

2、在MainHandler.java中写如下面内容:

package android.basic.lesson27;   
      
    import android.app.Activity;   
    import android.app.ProgressDialog;   
    import android.content.res.Resources;   
    import android.os.Bundle;   
    import android.os.Handler;   
    import android.os.Message;   
    import android.util.Log;   
    import android.view.View;   
    import android.widget.Button;   
      
    public class MainHandler extends Activity {   
      
            //声明变量   
            private Button b1;   
            private ProgressDialog pd;   
      
            //定义Handler对象   
            private Handler handler =new Handler(){   
                    @Override  
                    //当有消息发送出来的时候就执行Handler的这个方法   
                    public void handleMessage(Message msg){   
                            super.handleMessage(msg);   
                            //只要执行到这里就关闭对话框   
                            pd.dismiss();   
                    }   
            };   
      
            /** Called when the activity is first created. */  
        @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) {   
                                    //点击按钮后去处理长耗时操作   
                                    processThread();   
                            }   
                    });   
        }   
      
        private void processThread(){   
      
                //构建一个下载进度条   
                pd= ProgressDialog.show(MainHandler.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();   
        }   
      
        //模拟下载文件的长耗时方法   
        private void longTimeMethod(){   
                try {   
                        Log.i("tag", "longTimeMethod-->"+Thread.currentThread().getName());   
                            Thread.sleep(10000);   
                    } catch (InterruptedException e) {   
                            e.printStackTrace();   
                    }   
        }   
    }
3、res/layout/main.xml的内容就省略了,你们可以根据程序运行截图和程序代码反推出来布局组件。

4、运行程序查看结果:

这个例子里,在辅助线程的run方法中执行长耗时操作,操作完毕后调用handler.sendEmptyMessage()方法,主线程中的Handler的 handleMessage()方法接受到这一消息,并做了就是关闭对话框的处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: