异步跟新UI:

1、handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构造方法里接收handler参数,然后执行完耗时操作后,通过handler发送消息来通知主UI线程更新UI

2、接口回调,定义一个接口,然后在主UI执行耗时操作的时候,借助匿名内部类,在这里写异步线程返回来的数据处理操作,异步线程接收一个匿名的内部类实例,然后在执行完耗时操作后回调接口的方法,可以把耗时的操作的结果返回给回调函数

1的代码实现:

package com.example.testtesttest;

import org.json.JSONArray;

import com.example.testtesttest.DataRunnable.dataCallBackLisener;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity implements android.view.View.OnClickListener{ private Button button = null;
private dataCallBackLisener callbackListener ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button: DataRunnable runnable = new DataRunnable(handler);
Thread thread = new Thread(runnable);
thread.start(); break;
default:
break;
}
} public Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
button.setText("hhh");
break; default:
break;
}
};
}; }
package com.example.testtesttest;

import android.os.Handler;

public class DataRunnable implements Runnable{
private String[] dataString = new String[5];
private dataCallBackLisener listener;
private Handler dataHandler;
public DataRunnable(dataCallBackLisener alistener){
this.listener =alistener;
}
public DataRunnable(Handler aHandler){
this.dataHandler =aHandler;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i =0 ; i <5;i++)
{
dataString[i] = i+"";
}
dataHandler.sendEmptyMessage(1);
//listener.dataCallback(dataString);
}
public interface dataCallBackLisener{
public void dataCallback(String[] str);
}
}

2的代码实现:

package com.example.testtesttest;

import org.json.JSONArray;

import com.example.testtesttest.DataRunnable.dataCallBackLisener;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity implements android.view.View.OnClickListener{ private Button button = null;
private dataCallBackLisener callbackListener ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* JSONArray json = new JSONArray();
for(int i =0 ; i<4 ; i++){
json.put(i);
} String[] a = {"1","2","3"};
Log.e("Loooooooooook",a.toString());*/
button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button: DataRunnable runnable = new DataRunnable(new dataCallBackLisener() { @Override
public void dataCallback(String str) {
// TODO Auto-generated method stub
Log.e("hahahaahahahah", str.toString());
button.setText(str.toString()); //更新UI
}
});
runOnUiThread(runnable);
/*DataRunnable runnable = new DataRunnable(handler);
Thread thread = new Thread(runnable);
thread.start();*/
/*AnotherFragment fragment = new AnotherFragment();
android.app.FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.
beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.commit();*/ break;
default:
break;
}
} public Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
button.setText("hhh");
break; default:
break;
}
};
}; }
package com.example.testtesttest;

import android.os.Handler;

public class DataRunnable implements Runnable{
private StringBuilder dataString = new StringBuilder();
private dataCallBackLisener listener;
private Handler dataHandler;
public DataRunnable(dataCallBackLisener alistener){
this.listener =alistener;
}
public DataRunnable(Handler aHandler){
this.dataHandler =aHandler;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i =0 ; i <5;i++)
{
dataString.append(i);
}
//dataHandler.sendEmptyMessage(1);
listener.dataCallback(dataString.toString());
}
public interface dataCallBackLisener{
public void dataCallback(String str);
}
}

注意2中,thread必须是UIthread,这样才能更新主UI的控件

最后对回调函数的理解博客

http://www.zhihu.com/question/19801131

http://www.jianshu.com/p/cd35ce823602

http://www.bkjia.com/Androidjc/853632.html

最后一篇讲了名词:接口对象???不懂。。。。

安卓 异步线程更新Ui的更多相关文章

  1. Android中使用异步线程更新UI视图的几种方法

    在Android中子线程是不能更新ui的. 所以我们要通过其他方式来动态改变ui视图, 1.runOnUiThreadactivity提供的一个轻量级更新ui的方法,在Fragment需要使用的时候要 ...

  2. Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...

  3. Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面

    目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...

  4. 学习通过Thread+Handler实现非UI线程更新UI组件

    [Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...

  5. Android子线程更新UI的方法总结

    版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...

  6. C#子线程更新UI控件的方法总结

    http://blog.csdn.net/jqncc/article/details/16342121 在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从 ...

  7. 学习通过Thread+Handler实现非UI线程更新UI组件(转)

    [Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...

  8. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...

  9. OkHttp3几个简单的例子和在子线程更新UI线程的方法

    okHttp用于android的http请求.据说很厉害,我们来一起尝尝鲜.但是使用okHttp也会有一些小坑,后面会讲到如何掉进坑里并爬出来. 首先需要了解一点,这里说的UI线程和主线程是一回事儿. ...

随机推荐

  1. 如何参与Hibernate-ORM项目

    1.注册 hibernate jira账户,hibernate中的issue和bug都会在此论坛发布 注册地址:https://hibernate.onjira.com 2.创建Hibernate-O ...

  2. Entity Framework 学习初级篇3-- LINQ TO Entities

    LINQ 技术(即 LINQ to Entities)使开发人员能够通过使用 LINQ 表达式和 LINQ 标准查询运算符,直接从开发环境中针对 实体框架对象上下文创建灵活的强类型查询.LINQ to ...

  3. Vi 详细教程

    进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...

  4. 《LED调光-DMX512灯光协义接收控制》转

    源:http://blog.163.com/zhaojun_xf/blog/static/30050580200951023046891 来自: 作者:龙图开发网 文章来源:龙图开发网 时间:2009 ...

  5. 苹果充电器USB端的识别电阻的设置

    苹果为充电器定义了3种充电电流,分别是0.5A/1A/2.1A.具体是由3种不同的电阻组合来实现的.当苹果的设备ipad,iphone,ipod接入USB口充电器时,会先检测USB D+和D-上的电压 ...

  6. CentOS 单用户登录&命令行、图像界面

    如何单用户登录: 这是一个很简单的问题,以前没重视,每次linux服务器无法正常启动时,都找应急盘,想偷懒,反而浪费了时间. 今天备忘如下: 1.系统启动时,按光标键调出GRUB引导菜单. 2.选定一 ...

  7. 1025:To the max(DP)

    Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...

  8. [转] Linux下移动virtualbox虚拟硬盘丢失eth0

    1.遇到什么的问题(What)      在新的virtualbox虚拟机上挂上曾使用过的虚拟硬盘,在启动的时候,发现找不到网卡eth0, 在输入ifconfig –a的时候,也没有任何Ethnet的 ...

  9. 安装tomcat过程中出现问题小结

    报错信息如下:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these ...

  10. Android里merge和include标签的使用

    1.使用<include /> 标签来重用layout代码 如果在一个项目中需要用到相同的布局设计,可以通过<include /> 标签来重用layout代码,该标签在andr ...