- 浏览: 110440 次
- 性别:
- 来自: 北京
最新评论
-
饭更稀:
饭更稀 写道楼主这里写错了吧,第一部分:高16位表示MODE, ...
android绘制view的过程之一---------计算view大小(measure)(转) -
饭更稀:
楼主这里写错了吧,第一部分:高16位表示MODE,不应该是高3 ...
android绘制view的过程之一---------计算view大小(measure)(转) -
hovei:
...
http协议 -
liufang205:
...
http协议
AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便。这里就不详细说具体的使用方法了,同学可以Google 一下,很多。
场景模拟 当我们在加载一个列表的时候,比如GridView ,这时候我们考虑到不阻塞UI的做法,一般会使用线程Thread 、Timer 或者使用AsyncTask ,而这些操作都是在在后台另外开一个线程给我们找数据,具体得到的数据需要使用Handler 去更新UI,AsyncTask 也是一样使用到的Handler 只是它将Handler 封装在了onPostExecute 执行操作中。而这一操作可能会产生一个问题,比如你有一个列表更新数据库使用到的是AsyncTask 异步操作的方式更新UI,而你的需求是当我一进来这个列表就统计这个列表的数据的数量或者让某一行数据的状态为选中状态。传统做法是直接new 一个AsyncTask 类让它execute(); 之后会再操作UI。想法是对的,但有一个问题我们要注意到,因为它是异步加载数据的方式,而你的数据量比较多或许查找数据需要一定的时间的时候,这时使用AsyncTask 执行异步加载后更新UI再操作UI对象,可能会报空指针。
这个问题的产生是,我们都知道代码的执行是自上而下执行,当你使用异步加载数据的时候,代码让你去执行异步操作就不管了(多线程),而继续会往下执行代码,你下面的代码就是操作列表里面的UI,这时可想而知,异步加载数据还没有结束还没有对你的UI进行更新,这些你的列表应该是空的,而操作一个空的列表就会报空指针。
分析问题
使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:
•doInBackground 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。
•onPostExecute 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。
有必要的话你还得重写以下这三个方法,但不是必须的:
•onProgressUpdate 可以使用进度条增加用户体验度。
•onPreExecute 这里是最终用户调用Excute时的接口
•onCancelled 用户调用取消时,要做的操作
根据上面的思路,可以看出,最终数据加载并显示出来这一系列的操作都在onPostExecute 这个方法里面,那么如何监听所有UI都己经在onPostExecute 里面处理完成了,再去执行我们自己要操作呢?
解决问题
这里给出我自己解决这一问题的思路,有更好想法的朋友欢迎跟贴共同探讨。
首先创建一个接口
private interface isLoadDataListener {
public void loadComplete();
} 声明这一接口变量
private isLoadDataListener loadLisneter;
给接口赋值,得到接口对象
public void setLoadDataComplete(isLoadDataListener dataComplete) {
this.loadLisneter = dataComplete;
}
之后在AsyncTask 的onPostExecute处理UI完成后调用该接口,下面给出一个我以前项目使用到的AsyncTask 类:
class loadGridAsyncTask extends AsyncTask<Integer, Integer, AppsAdapter> {
private int poindex;
public loadGridAsyncTask(int positionindex) {
this.poindex = positionindex;
}
@Override
protected AppsAdapter doInBackground(Integer... params) {
// TODO Auto-generated method stub
// mAppsModel.clear();
Cursor temp = dbHelper.queryPageById(poindex);
loadPage(mApps, temp);
temp.close();
return new AppsAdapter(STB.this, mAppsModel);
}
@Override
protected void onPostExecute(AppsAdapter result) {
gridViewExt itemGrid = (gridViewExt) viewFlipper
.getChildAt(poindex);
itemGrid.setColumnCount(pageColumnCount);
itemGrid.setAdapter(result);
if (loadLisneter != null) {
loadLisneter.loadComplete();
}
}
}
通过上面的代码,我们就得到一个数据加载完成后返回的接口,接下来的问题就是我们利用这个接口来处理我们的UI了,比如让某一UI选中,得到这个列表的UI数量等,看下面的代码:
new loadGridAsyncTask(1).execute();
setLoadDataComplete(new isLoadDataListener() {
@Override
public void loadComplete() {
// TODO Auto-generated method stub
//这里执行你要的操作,当UI更新完成后会自动调用这里面的代码 }
});
多谢 记账本 指出本文的一个BUG,上面应改为:
setLoadDataComplete(new isLoadDataListener() {
@Override
public void loadComplete() {
// TODO Auto-generated method stub
//这里执行你要的操作,当UI更新完成后会自动调用这里面的代码 }
});
new loadGridAsyncTask(1).execute();
此篇文章希望能对入门不久的Android 开发者有帮助。
场景模拟 当我们在加载一个列表的时候,比如GridView ,这时候我们考虑到不阻塞UI的做法,一般会使用线程Thread 、Timer 或者使用AsyncTask ,而这些操作都是在在后台另外开一个线程给我们找数据,具体得到的数据需要使用Handler 去更新UI,AsyncTask 也是一样使用到的Handler 只是它将Handler 封装在了onPostExecute 执行操作中。而这一操作可能会产生一个问题,比如你有一个列表更新数据库使用到的是AsyncTask 异步操作的方式更新UI,而你的需求是当我一进来这个列表就统计这个列表的数据的数量或者让某一行数据的状态为选中状态。传统做法是直接new 一个AsyncTask 类让它execute(); 之后会再操作UI。想法是对的,但有一个问题我们要注意到,因为它是异步加载数据的方式,而你的数据量比较多或许查找数据需要一定的时间的时候,这时使用AsyncTask 执行异步加载后更新UI再操作UI对象,可能会报空指针。
这个问题的产生是,我们都知道代码的执行是自上而下执行,当你使用异步加载数据的时候,代码让你去执行异步操作就不管了(多线程),而继续会往下执行代码,你下面的代码就是操作列表里面的UI,这时可想而知,异步加载数据还没有结束还没有对你的UI进行更新,这些你的列表应该是空的,而操作一个空的列表就会报空指针。
分析问题
使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:
•doInBackground 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。
•onPostExecute 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。
有必要的话你还得重写以下这三个方法,但不是必须的:
•onProgressUpdate 可以使用进度条增加用户体验度。
•onPreExecute 这里是最终用户调用Excute时的接口
•onCancelled 用户调用取消时,要做的操作
根据上面的思路,可以看出,最终数据加载并显示出来这一系列的操作都在onPostExecute 这个方法里面,那么如何监听所有UI都己经在onPostExecute 里面处理完成了,再去执行我们自己要操作呢?
解决问题
这里给出我自己解决这一问题的思路,有更好想法的朋友欢迎跟贴共同探讨。
首先创建一个接口
private interface isLoadDataListener {
public void loadComplete();
} 声明这一接口变量
private isLoadDataListener loadLisneter;
给接口赋值,得到接口对象
public void setLoadDataComplete(isLoadDataListener dataComplete) {
this.loadLisneter = dataComplete;
}
之后在AsyncTask 的onPostExecute处理UI完成后调用该接口,下面给出一个我以前项目使用到的AsyncTask 类:
class loadGridAsyncTask extends AsyncTask<Integer, Integer, AppsAdapter> {
private int poindex;
public loadGridAsyncTask(int positionindex) {
this.poindex = positionindex;
}
@Override
protected AppsAdapter doInBackground(Integer... params) {
// TODO Auto-generated method stub
// mAppsModel.clear();
Cursor temp = dbHelper.queryPageById(poindex);
loadPage(mApps, temp);
temp.close();
return new AppsAdapter(STB.this, mAppsModel);
}
@Override
protected void onPostExecute(AppsAdapter result) {
gridViewExt itemGrid = (gridViewExt) viewFlipper
.getChildAt(poindex);
itemGrid.setColumnCount(pageColumnCount);
itemGrid.setAdapter(result);
if (loadLisneter != null) {
loadLisneter.loadComplete();
}
}
}
通过上面的代码,我们就得到一个数据加载完成后返回的接口,接下来的问题就是我们利用这个接口来处理我们的UI了,比如让某一UI选中,得到这个列表的UI数量等,看下面的代码:
new loadGridAsyncTask(1).execute();
setLoadDataComplete(new isLoadDataListener() {
@Override
public void loadComplete() {
// TODO Auto-generated method stub
//这里执行你要的操作,当UI更新完成后会自动调用这里面的代码 }
});
多谢 记账本 指出本文的一个BUG,上面应改为:
setLoadDataComplete(new isLoadDataListener() {
@Override
public void loadComplete() {
// TODO Auto-generated method stub
//这里执行你要的操作,当UI更新完成后会自动调用这里面的代码 }
});
new loadGridAsyncTask(1).execute();
此篇文章希望能对入门不久的Android 开发者有帮助。
发表评论
-
android绘制view的过程之一---------计算view大小(measure)(转)
2013-01-16 11:40 34011http://www.eoeandroid.com/forum ... -
[转]Android开发学习笔记:数据存取之SQLite浅析
2012-11-28 10:58 979一.SQLite的介绍 1.SQLite ... -
android 背景改变
2012-07-20 14:35 1055一:在xml里面设置 <?xml version=&qu ... -
转 android view构造函数研究
2012-07-16 13:37 2380上周遇到了SurfaceView的constructor的问题 ... -
ImageView 上显示文字
2012-07-16 09:59 1354@Override protected void onDra ... -
继承ImageView 实现了多点触碰的拖动和缩放
2012-07-16 09:58 981public class TouchView extends ... -
android中ansycTask的用法
2012-06-11 17:09 1766在开发Android应用时必须遵守单线程模型的原则: Andr ... -
android九宫格
2012-06-11 10:31 11161:打开android-sdk文件夹下的tool工具中的dra ... -
androlid 自定义字体
2012-06-07 11:08 10411、Android系统默认支持三种字体,分别为:“sans”, ... -
android 完全退出程序
2012-06-07 10:39 830android.os.Process.killProcess( ... -
[Android] 如何将应用程序转移到SD卡
2012-06-04 17:14 2543其实也只是将程序里的. ... -
android中用到的一些属性
2012-06-04 11:58 0如何防止Android应用中的Service被系统回收? 很 ... -
关键字飞入飞出效果
2012-06-04 10:47 1352一关键字样式及动画 pac ... -
android 传感器 SensorManager
2012-05-28 17:10 916传感器是一种物理装置,能够探测、感受外界的信号、物理条件(如光 ... -
android listview内容向上滚动
2012-05-25 14:54 39281:调用类 public class MainActivity ... -
android ui
2012-05-25 09:32 1250Android ui 一、 图片处理。 a) Drawable ... -
安卓开发中Bitmap/Drawable/byte[]互换 及Bitmap.Config里的一些参数
2012-05-25 09:17 1192在网上搜了一些其它的方法,在这里分享下 1.Drawab ... -
转 android 内容提供者contentprovider
2012-04-12 14:30 0内容提供器用来存放和获取数据并使这些数据可以被所有的应用程序访 ... -
activity onSaveInstanceState
2012-04-09 10:21 0先看Application Fundamentals ... -
转 androidopengl学习
2012-03-30 11:40 0ApiDemos 的Graphics示例中 ...
相关推荐
Android 使用AsyncTask 后监听异步加载完毕的动作 AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便。这里就不详细说具体的使用方法了,同学可以Google 一下,很多。 场景模拟 当我们在加载一个列表的...
Android AsyncTask用法和异步加载图片通过AsyncTask 从网络上异步加载一张图片
Android一词的本义指"机器人",同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是为移动终端打造的真正开放和完整的移动软件。...
Android一词的本义指"机器人",同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动...
AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习...
Android Handler AsyncTask 异步加载
Android 使用AsyncTask异步更新UI界面
http://blog.csdn.net/rwyz1314/article/details/6841639 的代码。放在这里做为备份。上一个文件传错了。也没法删除。只好重新传一个。
Android中使用ListView数据异步加载与AsyncTask,获取网络资源,线程池技术,多线程技术。
AsyncTask 异步多线程加载Demo
通过AsyncTask 从网络上异步加载一张图片
这是Android 异步加载图片-AsyncTask一文的代码,放在这里做个备份。 原文见 http://blog.csdn.net/rwyz1314/article/details/6841639
Android AsyncTask异步处理下载网页
基于Android的AsyncTask异步任务, Android的AsyncTask将复杂的数据处理交由子线程, 将处理过程交由主线程处理
Gallery使用AsyncTask异步批量加载图片,及每次异步加载5张图片
AsyncTask异步加载使用Demo,详解可以参考《Android中AsyncTask的使用详解》,代码中的注释也比较详细,初学者可以参考。
android 从SD卡上异步加载缩略图 利用AsyncTask 从SD卡上 异步加载 缩略图、
Android异步处理二:使用AsyncTask异步更新UI界面。