`
lwx522
  • 浏览: 35144 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

android子线程中刷新界面控件

 
阅读更多

为了线程安全,android在子线程中是不允许对界面元素进行刷新的,比如

        final ImageButton button = (ImageButton)this.findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("更改文本内容");
                    }
                }).start();
            }
        });

  是会报错:Only the original thread that created a view hierarchy can touch its views.

 

如果要在子进程刷新界面的话,可以使用android的handler机制,正确的使用方法如下:

        final ImageButton button = (ImageButton)this.findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        button.post(new Runnable() {
                            @Override
                            public void run() {
                                tv.setText("click");
                            }
                        });
                    }
                }).start();
            }
        });

 此列中button.post只所以不会报错是因为他的父类View中有一个handler的引用,相当于是handler.post, 

android中有一个保护机制,就是当界面在刷新时超过一段时间无响应时(20秒左右)程序就会退出,所以一般进行比较耗时的操作时必须另起一个线程,比如下载资源时,在整个过程中,我们一般同时还需要刷新下载的进度,如果是直接在子线程中刷新界面的话就会出现上面类似的错误。这个时候我们就需要使用到handler。具体列在如下:

 

        handler = new Handler(){
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case 1:
                    tv.setText("剩余下载时间:" + msg.arg1);
                    break;
                case 2:
                    tv.setText("下载完成");
                    break;
                }
            }
        };
                
        final ImageButton button = (ImageButton)this.findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        int time = 10000;
                        while(time > 0){
                            try {
                                Thread.sleep(1000);
                                time -= 1000;
                                Message msg = new Message();
                                msg.what = 1;
                                msg.arg1 = time;
                                //也可以发送对象
                                //msg.obj = obj;
                                handler.sendMessage(msg);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            
                        }
                        //下载完成,发送一个空消息
                        handler.sendEmptyMessage(2);
                        
                    }
                }).start();
            }
        });

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics