异步跟新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. Windows编译安装mod_wsgi,配合使用Django+Apahce

    编译环境: 均是32位版本 Microsoft Visual Studio 10.0 Microsoft SDKs v7.1 Apache2.4 Python3.4 mod_wsgi-4.5.0 要求 ...

  2. asp读取指定目录下的文件名

    bianli(Server.MapPath("/")+"\pic") InStrRev("abcd.jpg", ".") ...

  3. HDU1372,BFS象棋马走日

    简单的对于bfs的运用,但是还是写的太慢了写了TMD的1H,主要是不熟悉,以后慢慢熟悉就好了,模型基本已经能建立了,主要出现bug是在方向数组的运用上面,一定要记得是从0开始的,而不是从1开始的,导致 ...

  4. Kyoto Cabinet--nosql型单机数据库

    摘要: Kyoto Cabinet是轻量级nosql型本地内存数据库 简介 Kyoto Cabinet是一个数据库管理的 lib,是 Tokyo Cabinet 的改进版本.数据库是一个简单的包含记录 ...

  5. jq中的css-Dom

    1,height() ,width() 此方法用来获取匹配元素的高和宽的值,如果括号内有值,则是修改匹配元素的值, 2.offset() 此方法的作用是获取元素在当前视窗的相对偏移,其中返回的对象包含 ...

  6. abstract class 与interface

    一.抽象类(absteact class) 特点: 1.抽象方法只作说明,而不包含实现,可以看成是没有实现体的虚方法 2.抽象类不能被实例化.除此之外,具有类的其他特性 3.抽象类可以但不是必须有抽象 ...

  7. SQL2005附加数据库时遇到的问题:用户组或角色在当前数据库已存在

    一次 附加备份数据库的 mdf 文件     成功后   创建登陆用户    但是  无法映射该用户的 对应数据库  出现 用户组或角色在当前数据库已存在 的问题 首先介绍一下sql server中“ ...

  8. SQL模擬死結產生

    引用自:http://jengting.blogspot.tw/2012/06/sql.html 根據 MSDN 將死結數量降至最低 裡的圖型模擬死結產生 ~~ 在 SSMS 內開啟兩個 T-SQL ...

  9. C/C++ strtok函数

    一.头文件:#include <string.h> 二.函数原型:char * strtok (char *str, const char * delimiters); 三.参数:str, ...

  10. POJ 3254 Corn Fields(状态压缩)

    一道状态压缩的题,错了好多次....应该先把满足的情况预处理出来 #include<iostream> #include<cstdio> #include<cstring ...