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. ...
随机推荐
- centos 6.5卸载Mysql
yum remove mysql mysql-server mysql-libs mysql-server
- spring定时任务轮询(spring Task)
定时任务轮询比如任务自服务器启动就开始运行,并且每隔5秒执行一次. 以下用spring注解配置定时任务.1.添加相应的schema xmlns:task=" xsi:schemaLocati ...
- 通过实验窥探javascript的解析执行顺序
简介 javascript是一种解释型语言,它的执行是自上而下的.但是各浏览器对于[自上而下]的理解是有细微差别的,而代码的上下游也就是程序流对于程序正确运行又是至关重要的.所以我们有必要深入理解js ...
- Redis教程(十):持久化详解
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/137.html 一.Redis提供了哪些持久化机制: 1). RDB持久化 ...
- paip. java的 函数式编程 大法
paip. java的 函数式编程 大法 Java 语言中常被忽视的一个方面是它被归类为一种命令式(imperative)编程语言.命令式编程虽然由于与 Java 语言的关联而相当普及,但是并不是惟一 ...
- Spark安装指南
一.Windows环境安装Spark 1.安装Java环境:jdk-8u101-windows-x64 配置环境变量: (1)增加变量名:JAVA_HOME 变量值:C:\Program File ...
- android: SQLite 数据库的最佳实践
6.5.1 使用事务 前面我们已经知道,SQLite 数据库是支持事务的,事务的特性可以保证让某一系列的操 作要么全部完成,要么一个都不会完成.那么在什么情况下才需要使用事务呢?想象以下场 景, ...
- Windows中搭建已存在的Octopress环境
// 当我们需要在不同的电脑上来对同一个Octopress博客进行维护的时候就需要针对已存在的Octopress来设置环境了, 安装相应的软件 Git:http://msysgit.googlecod ...
- visual webgui theme designer
- Naked Search in service
public List<TplRelease> searchTplReleaseById(TplRelease tr)throws Exception{ DBOperator dbo = ...