安卓 异步线程更新Ui
异步跟新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的更多相关文章
- Android中使用异步线程更新UI视图的几种方法
在Android中子线程是不能更新ui的. 所以我们要通过其他方式来动态改变ui视图, 1.runOnUiThreadactivity提供的一个轻量级更新ui的方法,在Fragment需要使用的时候要 ...
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...
- Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面
目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...
- 学习通过Thread+Handler实现非UI线程更新UI组件
[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...
- Android子线程更新UI的方法总结
版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...
- C#子线程更新UI控件的方法总结
http://blog.csdn.net/jqncc/article/details/16342121 在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从 ...
- 学习通过Thread+Handler实现非UI线程更新UI组件(转)
[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...
- C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...
- OkHttp3几个简单的例子和在子线程更新UI线程的方法
okHttp用于android的http请求.据说很厉害,我们来一起尝尝鲜.但是使用okHttp也会有一些小坑,后面会讲到如何掉进坑里并爬出来. 首先需要了解一点,这里说的UI线程和主线程是一回事儿. ...
随机推荐
- thinkPHP16---伪静态
url伪静态通常是为了 满足更好的SEO效果,thinkPHP支持伪静态url设置,可以通过设置URL_HTML_SUFFIX的参数 随意在URL的最后添加你想要的静态后缀,而不会影响当前操作的正常执 ...
- getWritableDatabase()与getReadableDatabase()的区别:
getWritableDatabase取得的实例不是仅仅具有写的功能,而是同时具有读和写的功能同样的 getReadableDatabase取得的实例也是具对数据库进行读和写的功能. 两者的区别在于 ...
- Struts+Spring+Hibernate的Web应用执行过程
struts1和spring有两种整合的方法 一种是action和spring bean映射:一种是将action交给spring初始化 第一种方式:访问.do的URL->tomcat接收到r ...
- 如何查看和更改mysql数据库文件存放位置
mysql数据库的数据文件默认是存放在:C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.1\data ...
- IE6下绝对定位元素父级宽高是奇数,绝对定位元素的right和bottom值会有1个像素的偏差
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Qt5:随窗口大小变化背景图片自动缩放的实现
在窗口程序中,当我们改变窗口大小的时候,背景图片通常会岁窗口大小变化而缩放 然而,在我们写的窗口程序中,设置背景图片后,如果缩放大小,会看到背景图片并不会随之缩放, 应为这需要特殊处理,一般常用的方法 ...
- 执行 apt-get -f install 提示错误
执行 apt-get -f install 提示错误 分类: Linux 2015-01-24 21:26 554人阅读 评论(0) 收藏 举报 1. 问题: usloft1359:~# rvm in ...
- StarUML---推荐一款UML工具(很好很强大)
转自:http://www.cnblogs.com/daizhj/archive/2008/04/14/1153121.html 上周我的一个朋友,同时也是目前公司的同事给我推荐了一款UML工具,开始 ...
- Android——init可执行程序
init进程是Android启动后,系统执行的第一个名称为init的可执行程序. 功能: 设备管理 解析启动脚本init.rc 执行启动脚本中的基本功能 执行启动脚本中的各种服务 代码路径:syste ...
- RAD Studio 2010 环境设置(转)
源:RAD Studio 2010 环境设置 最近在使用RAD Studio 2010做一些开发和实验,但在安装了自定义的控件及第三方下载的控件后,在我的工程里经常会提示找不到DCU,为了以后忘记这一 ...