为了线程安全,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(); } });
相关推荐
MFC子线程中更新控件内容的两种办法 MFC子线程中更新控件内容的两种办法
主要介绍了C#子线程更新UI控件的方法,在桌面应用程序中控制UI界面有着不错的实用价值,需要的朋友可以参考下
VS2017工程,MFC子线程中更新控件的内容,采用全局函数的方法来实现,简单易懂,非常方便新手的入门。
在MFC 子线程中使用UI(控件)退出时死锁或者超时处理参考
三种更新主线程的方法;handler的两种
VS2017工程,MFC子线程中更新控件的内容,采用消息机制来实现,简单易懂,非常方便新手的入门。
子线程操作主线程控件,不卡顿,简易高效,代码人人看的懂
Android 通过子线程加载URL图片
子线程创建界面组件
子线程中更新UI的三种方法和获取message的两种方法总结
Android中两个子线程的通信demo
Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码...
C# winform 多线程 让子线程也能操作界面的方法 源代码
MFC子线程访问/控制对话框程序控件
dialog库,可以在任意类内调用,子线程或ui线程内均可显示
这是一个单文档MFC应用程序,建立了两个线程,线程函数的执行过程中,会更改状态栏上的显示文本。 希望对于初学多线程的朋友有所帮助!
Android子线程上传视频到rtmp,二次封装
Android获得控件和状态栏高度,通过反射方式获取状态栏高度,通过dime获取组件高度。不同于普通获取状态栏高度,还得需要在子线程中获取
Qt的子线程无法直接更新主UI,需要发送信号到主线程进行更新,我用的QTableWidget展示数据。