为了线程安全,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();            }        });

更多相关文章

  1. 启动模式详解
  2. android com.handmark.pulltorefresh 使用技巧
  3. Android(安卓)实现在Java代码中修改UI界面,并修改界面
  4. Android(安卓)EditText取消自动焦点获取
  5. android 开发收银系统,弹出键盘固定界面UI的方法
  6. android下的android.os.StrictMode$AndroidBlockGuardPolicy.onN
  7. android 主线程和子线程之间的消息传递
  8. Android学习中遇到的问题及解决方案
  9. Android中自动跳转到系统设置界面

随机推荐

  1. Android应用间调用方式——URL Scheme
  2. android GSM incoming电话部分流程
  3. android小记之手动安装apk
  4. selector修改TextView点击后的颜色属性
  5. AudioTrack使用示例
  6. android中使用 定时更新界面定时器Timer
  7. android 学习日记
  8. Android(安卓)属性系统(翻译)
  9. Android(安卓)中同一个TextView设置不同
  10. android命令行启动程序