Android之线程回掉更新ui
一:工作线程中的回掉更新UI
public class MainActivity extends AppCompatActivity {
private int i;
private Callback mCallback;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.text);
mCallback = new Callback() {
@Override
public void callback(int i) {
textView.setText("i");
}
};
doWorkAsNewThread(5000,mCallback);
}
/**
* 开启工作线程
* @param delayMs 延时,以便对比
* @param callback 回掉,更新Ui
*/
private void doWorkAsNewThread(final long delayMs, final Callback callback){
new Thread(){
@Override
public void run() {
super.run();
try {
Thread.sleep(delayMs);
} catch (InterruptedException e) {
e.printStackTrace();
}
do {
i++;
}while(i<100);
callback.callback(i);
}
}.start();
}
interface Callback{
void callback(int i);
}
可以看到5s后报错了:Only the original thread that created a view hierarchy can touch its views.
二:改造2,在线程里切换到UI线程回掉
private void doWorkAsNewThread(final long delayMs, final Callback callback){
new Thread(){
@Override
public void run() {
super.run();
try {
Thread.sleep(delayMs);
} catch (InterruptedException e) {
e.printStackTrace();
}
do {
i++;
}while(i<100);
textView.post(new Runnable() {
@Override
public void run() {
callback.callback(i);
}
});
}
}.start();
}
这样是可行的,没报错。直接在Callback中改也可以:
mCallback = new Callback() {
@Override
public void callback(final int i) {
textView.post(new Runnable() {
@Override
public void run() {
textView.setText(String.valueOf(i));
}
});
}
};
但是两边都有回掉的话,好像会有问题。
三:异步线程内,用handler去更新是无效的。
new Handler().post(new Runnable() {
@Override
public void run() {
textView.setText(String.valueOf(i));
}
});
Can't create handler inside thread that has not called Looper.prepare()
加上loop一样还是其他线程。
Looper.prepare();
new Handler().post(new Runnable() {
@Override
public void run() {
textView.setText(String.valueOf(i));
}
});
Looper.loop();
四:回掉自行区分选择在哪个线程:
private void callbackOnWorkThread(final int i, final Callback callback){
Looper.prepare();
new Handler().post(new Runnable() {
@Override
public void run() {
callback.callback(i);
}
});
Looper.loop();
}
private void callbackOnMainThread(final int i, final Callback callback){
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
callback.callback(i);
}
});
}
Android之线程回掉更新ui的更多相关文章
- Android中子线程真的不能更新UI吗?
Android的UI访问是没有加锁的,这样在多个线程访问UI是不安全的.所以Android中规定只能在UI线程中访问UI. 但是有没有极端的情况?使得我们在子线程中访问UI也可以使程序跑起来呢?接下来 ...
- Android子线程真的不能更新UI么
Android单线程模型是这样描述的: Android UI操作并不是线程安全的,并且这些操作必须在UI线程执行 如果在其它线程访问UI线程,Android提供了以下的方式: Activity.run ...
- 36.Android之多线程和handle更新UI学习
android经常用到多线程更新UI,今天学习下. 首先布局比较简单: <?xml version="1.0" encoding="utf-8"?> ...
- Android线程间通信更新UI的方法(重点分析EventBus)
Android的UI更新只能在UI线程中,即主线程.子线程中如果要进行UI更新,都是要通知主线程来进行. 几种实现方式总结如下,欢迎补充. 1.runOnUiThread() 子线程中持有当前Acti ...
- Mono for android 如何动态添加View,线程内部如何更新UI.
貌似所有设计到UI的程序原理都是一样的,子线程是不能够更新UI状态的,所以就必须使用UI自身或者第三方来更新UI. 如 在WinForm 中 就可以使用Control.Invoke(Action ac ...
- 在Android中实现service动态更新UI界面
之前曾介绍过Android的UI设计与后台线程交互,据Android API的介绍,service一般是在后台运行的,没有界面的.那么如何实现service动态更新UI界面呢?案例:通过service ...
- Android Handler传递参数动态更新UI界面demo
package com.example.demo_test; import android.app.Activity; import android.os.Bundle; import android ...
- 【转】Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask
方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...
- Android 通过广播来异步更新UI
之前的项目里要做一个异步更新UI的功能,可是结果出现了ANR,所以想写个demo来測试究竟是哪个地方出现了问题,结果发现原来的思路是没有问题,郁闷~~ 如今这个demo 就是模拟项目里面 的步骤 1. ...
随机推荐
- 支持事件穿透?使用pointer-events样式
使用绝对定位元素,让元素A完全盖住元素B时,如何通过元素A来响应元素B的事件呢? 上图可以用下面的SVG代码来实现: <svg width="200" height=&quo ...
- FreeIconMaker - 在线创建免费和时尚的图标
在设计一个网站或 Web 应用程序时,你不能否认网页设计工具的重要性,这些工具有助于简化您的任务和完成您的项目.FreeIconMaker.com 是一个免费的在线图标制作工具,您也可以创建自己的模板 ...
- Nodejs学习笔记(十三)— PM2
目录 简介 pm2安装 操作 启动 关闭 其它方式启动/关闭 从PM2中删除 重载和重启 查看详细信息 多项目操作 集群 其它操作 写在之后... 简介 PM2 pm2是一个内置负载均衡的node.j ...
- atitit.软件开发方法总结O6
atitit.软件开发方法总结O6 #--cmm/cmmi 都晓得这个. #--IPD集成产品开发 结构化的流程 IPD工具:包括业务及技术上的共工具. 5.考评:包括团队和个人绩效考核两个方面:首 ...
- C#:Oracle数据库带参PLSQL语句的正确性验证
在有Oracle数据库C#项目中,有一个这样的需求:在界面上配置了带参数的PLSQL语句,但是要通过程序验证其正确性,那么该如何实现?这就是本文要探讨的内容. 一:通过OracleCommand对象的 ...
- oracle违反完整约束条件
oracle违反完整约束条件 Oracle ORA-02292: 违反完整约束条件 (UNITELE.TA_SUB_REFERENCE3) - 已找到子记录 A表被B表引用,删除A表的时候提示ORA- ...
- [推荐]PMO学习贴大集合
[推荐]PMO学习贴大集合 http://wenku.baidu.com/view/a9b19bd4240c844769eaeed9.html http://wenku.baidu.com/view/ ...
- 我所理解的JavaScript闭包
目录 一.闭包(Closure) 1.1.什么是闭包? 1.2.为什么要用闭包(作用)? 1.2.1.保护函数内的变量安全. 1.2.2.通过访问外部变量,一个闭包可以暂时保存这些变量的上下文环境,当 ...
- C# 串口操作 ---- 系列文章
C# 串口操作系列(5)--通讯库雏形 通讯库雏形的建立. 串口通讯介绍的高级篇,介绍更高级的抽象,为扩展为通用的客户端通讯库做铺垫,扩展性的考虑,能支持任意类型的流设备. ... 2010-08-0 ...
- asp.net关于页面不回发的问题,寻求完美解决方案
原文地址:http://www.sufeinet.com/thread-4564-1-1.html 这个问题我相信有不少人见过,就是使用系统的分页功能时,或者是使用系统控件,都会有一个回发的功能, 这 ...