为了线程安全,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. Android 实现在Java代码中修改UI界面,并修改界面
  2. android 开发收银系统,弹出键盘固定界面UI的方法
  3. Android应用程序组件Content Provider的共享数据更新通知机制分
  4. Android应用程序键盘(Keyboard)消息处理机制分析(10)
  5. android 主线程和子线程之间的消息传递
  6. Android应用程序键盘(Keyboard)消息处理机制分析(21)
  7. Android中自动跳转到系统设置界面
  8. Android中界面实现全屏显示的两种方式

随机推荐

  1. Android(安卓)adb无线调试,保护手机USB口,
  2. Android(安卓)使用ListView的A-Z字母排序
  3. Android中的内存泄漏模式
  4. android项目打包
  5. Android(安卓)源码编译加速 使用ccache
  6. 从零开始--系统深入学习android(实践-让我
  7. 【Tech】android真机测试——小米3
  8. android 加载外部 dex文件中的类 的源码
  9. Android(安卓)蓝牙低功耗Ble Gatt浅谈
  10. Android自定义View实战---圆盘温度计