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. ...
随机推荐
- [ACM_图论] Fire Net (ZOJ 1002 带障碍棋盘布炮,互不攻击最大数量)
Suppose that we have a square city with straight streets. A map of a city is a square board with n ...
- [ucgui] 对话框3——GUIBuilder生成界面c文件及修改
>_<" 其实生成GUI有相应的工具:
- jQuery的XX如何实现?——2.show与链式调用
往期回顾: jQuery的XX如何实现?——1.框架 -------------------------- 源码链接:内附实例代码 jQuery使用许久了,但是有一些API的实现实在想不通.于是抽空看 ...
- Spring-Context之一:一个简单的例子
很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...
- Abp Application级别的生命周期
本篇级别: 中高级篇,假设各位知道Abp是什么, Abp里面的基本的概念及用法(想了解基本概念的可在这里学习: http://www.cnblogs.com/mienreal/p/4358806.ht ...
- 深入了解javascript事件流
摘要:事件流这个东西是比较重要的,为了让自己更加理解js中的事件流,必须整理整理,梳理一下事件流的各种东西啊.本文大部分内容参考<javascript高级程序设计第三版> 先来一段书里的原 ...
- xib与nib的区别
xib和nib都是Interface Builder的图形界面设计文档,nib这个名字来自于NeXTSTEP系统,在NeXTSTEP被Apple收购之前,一直使用nib作为Interface Buil ...
- web前端基础——jQuery编程进阶
1 jQuery本质 jQuery不是一门独立的语言,它是JavaScript的一个类库或框架.jQuery的核心思想就是:选取元素,对其操作.很多时候写jQuery代码的关键就是怎样设计合适的选择器 ...
- Objective-C 高性能的循环
Cocoa编程的一个通常的任务是要去循环遍历一个对象的集合 (例如,一个 NSArray, NSSet 或者是 NSDictionary). 这个看似简单的问题有广泛数量的解决方案,它们中的许多不乏 ...
- iOS:如何通过UIEdgeInsetsMake来制作可伸缩的Button
注:本文翻译自国外iOS开发者Natasha The Robot的一篇博文,链接在此.在iOS应用中,经常会有很多Button有相同的背景图片,却由于处在不同的位置而大小不同(尽管在iOS7中Butt ...