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更新完成后会自动调用这里面的代码 }
});
此篇文章希望能对入门不久的Android 开发者有帮助。
本文出自 “Terry_龙
” 博客,请务必保留此出处http://terryblog.blog.51cto.com/1764499/508629
相关推荐
Android 使用AsyncTask 后监听异步加载完毕的动作 AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便。这里就不详细说具体的使用方法了,同学可以Google 一下,很多。 场景模拟 当我们在加载一个列表的...
在本文中,我们将探讨如何在`AsyncTask`中监听异步加载完毕的动作,以及如何解决可能出现的问题。 `AsyncTask`的执行流程主要包括以下几个关键方法: 1. `onPreExecute()`:在后台任务开始之前调用,通常用于初始...
Android一词的本义指"机器人",同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是为移动终端打造的真正开放和完整的移动软件。...
Android一词的本义指"机器人",同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动...
本示例将围绕“ListView异步加载网络数据”这一主题展开,主要涉及`AsyncTask`的使用。 `AsyncTask`是Android提供的一种轻量级的异步处理类,适用于短时间、不频繁的后台任务,特别适合于进行网络请求、数据库操作...
3. **异步加载更多数据**:当判断到ListView滚动到底部后,我们需要执行异步加载数据的操作。这通常涉及到网络请求或数据库查询。可以使用AsyncTask、Handler、Retrofit、Volley等工具来处理网络请求。加载数据的...
3. **数据加载**:在监听到滚动到底部的事件后,调用异步加载数据的方法,如使用AsyncTask或者Retrofit进行网络请求。加载完成后,将新数据添加到Adapter的数据源,然后调用`adapter.notifyDataSetChanged()`通知...
而是应该使用AsyncTask或其他异步处理机制来加载新数据,加载完毕后再更新Adapter。 4. **添加Footer View**: 在ListView底部添加一个“加载更多”的Footer View,可以提示用户数据正在加载。当数据加载完成后,...
1. **异步加载**:为了不阻塞主线程,刷新和加载更多操作应在子线程中执行,可以通过AsyncTask、Retrofit、Coroutines等方式实现。 2. **空状态处理**:当没有数据时,提供清晰的提示,避免用户困惑。 3. **防止重复...
当数据加载完毕后,再切换回主线程更新UI。 8. **优化性能**: 使用ViewHolder设计模式可以提高ListView的滚动性能,减少视图复用时的查找和创建成本。此外,考虑使用ListAdapter或RecyclerView替换ListView,它们...
使用AsyncTask可以将数据加载和解析放到后台线程,处理完毕后再通知主线程更新ListView。Loader则更适用于生命周期管理,当Activity或Fragment被重建时,Loader能自动恢复之前的状态。 二、异步加载图片 在ListView...
3. 平滑滚动:为了避免用户在数据加载期间看到ListView的空白区域,可以设置一个FooterView作为加载指示器,如一个进度条,直到新数据加载完毕并添加到ListView中。 无论是哪种方式,动态分步加载的核心思想都是...
- 在加载过程中,可以显示一个加载提示(如ProgressBar或Loading动画),加载完毕后移除。 - 如果没有更多数据,可以显示“没有更多数据”或者“已加载全部”这样的提示。 8. **优化体验**: - 避免在主线程进行...
5. **显示加载状态**:在加载过程中,可以显示一个加载提示或者进度条,加载完毕后隐藏。 四、注意事项 1. **数据处理**:确保新加载的数据与已有的数据能够正确合并,避免重复显示。 2. **性能优化**:分页加载...
可以使用AsyncTask或其他异步处理方式,加载完成后,在主线程更新UI。记得在数据加载过程中,为用户显示加载提示,如进度条,以提高用户体验。 最后,为了实现平滑的滑动效果,可能需要对ViewPager的缓存策略做一些...
5. **异步加载数据**:在确定用户已经滚动到底部后,我们不应该在主线程中加载更多数据,因为这会阻塞UI,造成应用卡顿。应使用AsyncTask、Handler、Loader或Retrofit等工具在后台线程加载数据,加载完成后在主线程...
当用户滚动到列表底部时,尾部视图显示加载提示,并在数据加载完毕后隐藏。在`RefreshableListView`的`onScroll`方法中,判断当前滚动位置是否接近底部,如果是,则调用`loadMore()`方法,启动加载更多数据的逻辑。 ...
综上所述,实现Android ListView的下拉刷新和上拉加载更多功能,需要结合SwipeRefreshLayout、Adapter的自定义、ListView的滚动监听以及异步加载技术。通过这些方法,可以提升应用的交互性和数据获取效率,提供更好...