安卓 异步线程更新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线程和主线程是一回事儿. ...
随机推荐
- equal与==区别
对于String中的“equal方法”和“==”一直有点混肴,今天重新看了一下他们两点的区别,记录下来让自己以后不在忘记! 先说“==”: “==”是用来比较两个String对象在内存中的存放地址是否 ...
- html base2
<html> <body> <h1>My First Web Page</h1> <p id="demo">A Para ...
- git第三篇---建立一个project
Git global setup: git config --global user.name "xx" git config --global user.email " ...
- 剑指offer之有序二维数组查找
大多数人注意到元素是行列有序的,会马上想到对每行(或列)进行二分查找,每行(或列)需要logN时间,N行(或列)共需要NlogN时间,很容易写出如下代码 1 2 3 4 5 6 7 8 9 10 11 ...
- spring,hibernate配置事务
1. 新建java project 2. 引入jar 3. src下新建package:com.web.model, com.web.dao, com.web.service, bean.xml 4. ...
- Android应用性能测试之CPU和内存占用
最近发现自己学的很多东西没有做好积淀的工作,也萌生了写一些东西的念头.本人也没有写博客的习惯,下边就写一下手机端的性能测试. 最近公司,要我们从事对竞品的性能测试,我负责CPU和内存的性能测试,下面就 ...
- apt
今天单元测试看到巨长字符串被加了很多引号,想起以前可以用跳脱符断行,试了不行,google说java7可以,我操. https://github.com/benelog/multiline/wiki/ ...
- IMosaicWorkspaceExtensionHelper
Provides a helper for working with a mosaic dataset workspace extension. Product Availability Availa ...
- 删除DriverStore\FileRepository文件夹后,设备驱动无法安装,提示“没有为设备信息集或元素选择驱动程序(代码 28)”的解决办法
前言: 我前几天手贱,整个FileRepository删除掉了,之后重启就出现了让人蛋疼的这个问题,因为出于各种原因不想重装系统,百度轮番换搜索词无果,虽然驱动装上了但新设备依然无法自动安装驱动等“一 ...
- PS2键盘 + LCD12864 实验
本实验是通过LCD12864来显示键盘上被按下的按键,实验比较简单,在LCD12864固定的DDRAM地址上显示,缺点就是不能保存上一次被按的内容,后者会覆盖掉前面,所以屏上仅有一个字符显示.保存上一 ...