一:工作线程中的回掉更新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的更多相关文章

  1. Android中子线程真的不能更新UI吗?

    Android的UI访问是没有加锁的,这样在多个线程访问UI是不安全的.所以Android中规定只能在UI线程中访问UI. 但是有没有极端的情况?使得我们在子线程中访问UI也可以使程序跑起来呢?接下来 ...

  2. Android子线程真的不能更新UI么

    Android单线程模型是这样描述的: Android UI操作并不是线程安全的,并且这些操作必须在UI线程执行 如果在其它线程访问UI线程,Android提供了以下的方式: Activity.run ...

  3. 36.Android之多线程和handle更新UI学习

    android经常用到多线程更新UI,今天学习下. 首先布局比较简单: <?xml version="1.0" encoding="utf-8"?> ...

  4. Android线程间通信更新UI的方法(重点分析EventBus)

    Android的UI更新只能在UI线程中,即主线程.子线程中如果要进行UI更新,都是要通知主线程来进行. 几种实现方式总结如下,欢迎补充. 1.runOnUiThread() 子线程中持有当前Acti ...

  5. Mono for android 如何动态添加View,线程内部如何更新UI.

    貌似所有设计到UI的程序原理都是一样的,子线程是不能够更新UI状态的,所以就必须使用UI自身或者第三方来更新UI. 如 在WinForm 中 就可以使用Control.Invoke(Action ac ...

  6. 在Android中实现service动态更新UI界面

    之前曾介绍过Android的UI设计与后台线程交互,据Android API的介绍,service一般是在后台运行的,没有界面的.那么如何实现service动态更新UI界面呢?案例:通过service ...

  7. Android Handler传递参数动态更新UI界面demo

    package com.example.demo_test; import android.app.Activity; import android.os.Bundle; import android ...

  8. 【转】Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask

    方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...

  9. Android 通过广播来异步更新UI

    之前的项目里要做一个异步更新UI的功能,可是结果出现了ANR,所以想写个demo来測试究竟是哪个地方出现了问题,结果发现原来的思路是没有问题,郁闷~~ 如今这个demo 就是模拟项目里面 的步骤 1. ...

随机推荐

  1. [ACM_数学] LA 3708 Graveyard [墓地雕塑 圈上新加点 找规律]

    Description   Programming contests became so popular in the year 2397 that the governor of New Earck ...

  2. Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面

    Xamarin.Forms 是一个跨平台的.基于原生控件的UI工具包,开发人员可以轻松的创建适用于 Android,iOS 以及 Windows Phone的用户界面.Xamarin.Forms 通过 ...

  3. js如何实现继承

    js继承有5种实现方式:1.继承第一种方式:对象冒充  function Parent(username){    this.username = username;    this.hello = ...

  4. js程序设计03——面向对象

    ECMAScript中有2中属性:数据属性.访问器属性. 数据属性是为了指定某对象的指定key上的一些行为,比如value是否可删除.修改.key可循环遍历等特点.而访问器属性不包含数据值,包含一堆g ...

  5. javaweb回顾第一篇servlet的学习和理解

    前言:关于servlet相信学过java的都不会陌生,我最近又把这些基础知识整理一遍,便于自已能更好的理解ssm或者ssh,下面开始 1:Servlet接口 servlet有5个方法下面分别简单的介绍 ...

  6. JQuery快速入门

    Write less, do more, I like jQuery. jQuery是最常用的js库,整体来说非常轻量并易于扩展,对于移动应用可以使用其更轻量的孪生兄弟Zepto代替.其是由John ...

  7. 幾個步驟輕鬆在windows操作系統上搭建GO語言開發環境

    1. 首先下载官方GO語言安装包: https://code.google.com/p/go/wiki/Downloads?tm=2 2. 设置 GOPATH 在任意磁盘根目录新建一个文件夹,名字随意 ...

  8. 如何获得WPA握手包&EWSA破解WPA密码教程[zz]

    获得WPA\WPA2 握手包的方法有很多,下面介绍通过aircrack-ng工具包来载获握手数据包. 1.下载aircrack-ng工具包. 2.终端里输入 sudo airmon-ng start ...

  9. (转)阴影锥(Shadow Volume)

    转自:http://blog.csdn.net/zjull/article/details/11819923 Shadow Map和Shadow Volume是当今比较流行的实时阴影渲染方法,跟Sha ...

  10. 安装Weblogic12.1.3时遇到jre1.7.0_71不是有效的 JDK

    解决方案:把fmw_12.1.3.0.0_wls.jar放到%JAVA_HOME%\bin目录下,然后执行java -jar fmw_12.1.3.0.0_wls.jar就能安装了.