1. 简介:
我们经常在Fragment中进行异步加载的操作。在Android中的Fragment中,提供了异步加载管理器LoaderManager,可以进行对异步加载进行管理。从而简化了应用程序开发复杂度。
2. Fragment中的Loader相关组件和类图:
类图如下:
说明:
(1)LoaderTask:是继承自AsyncTask,并且实现了Runnable,它具备了异步任务的能力;
(2)AsyncTaskLoader:继承自Loader,而且有LoaderTask类的数据成员,所以,它可以进行异步加载;
(3)LoaderManager:为了更方便的进行Loader的管理,Android系统提供了这个加载管理器;每一个Activity 和 Fragments 只能存在一个LoaderManager;
(4)LoaderInfo:需要加载的数据的信息;是一个基础类,可以由用户自行扩展适合自己的类;
(5)LoaderCallbacks: 由于是异步加载,所以,提供了callback回调函数。需要用户来实现相关函数;包括初始化、创建、重新启动、销毁、结束等一系列实用接口等。
(6)Fragment:Fragment基类,提供了mLoaderManager,通过这个数据成员来进行异步加载的管理。用户可以继承自Fragment,来实现Fragment中的异步加载功能。
通过以上架构,用户就可以实现Fragment中的异步加载功能。
3. 举例:应用列表的显示,利用Fragment和Loader来实现。
实现思路:
(1)应用程序列表的存储:
定义一个AppModel,来存储一个应用程序信息;
List<ApplicationInfo> apps = mPm .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_DISABLED_COMPONENTS);
(2)异步加载这些信息:
自定义一个AsyncTaskLoader
public class AppListLoader extends AsyncTaskLoader<List<AppModel>>
(3)界面相关:
自定义的Fragment和数据适配器adapter
public class DetailsFragment extends ListFragment implements OnQueryTextListener,LoaderCallbacks<List<AppModel>>
3.1 核心代码(AppListLoader.java):
public class AppListLoader extends AsyncTaskLoader<List<AppModel>> {
Context mContext;
final InterestingConfigChanges mLastConfig = new InterestingConfigChanges();
final PackageManager mPm;
List<AppModel> mApps;
AppReceiver mPackageObserver;
public AppListLoader(Context context) {
super(context);
// TODO Auto-generated constructor stub
mPm = getContext().getPackageManager();
mContext = context;
}
@Override
public List<AppModel> loadInBackground() {
// TODO Auto-generated method stub
@SuppressLint("WrongConstant") List<ApplicationInfo> apps = mPm
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES
| PackageManager.GET_DISABLED_COMPONENTS);
if (apps == null)
apps = new ArrayList<ApplicationInfo>();
final Context mContext = getContext();
List<AppModel> entries = new ArrayList<AppModel>(apps.size());
for (ApplicationInfo info : apps) {
AppModel entry = new AppModel(this, info);
entry.loadLable(mContext);
entries.add(entry);
}
Collections.sort(entries, ALPHA_COMPARATOR);
return entries;
}
@Override
public void deliverResult(
List<AppModel> data) {
// TODO Auto-generated method stub
if (isReset()) {
if (data != null) {
//释放资源处理
}
}
List<AppModel> oladApps=data;
mApps=data;
if(isStarted()){
super.deliverResult(data);
}
if(oladApps!=null){
//释放资源
}
}
protected void onStartLoading() {
if(mApps!=null)
deliverResult(mApps);
if(mPackageObserver==null)
mPackageObserver=new AppReceiver(this);
boolean configChange=mLastConfig.applyNewConfig(getContext().getResources());
if(takeContentChanged()|| mApps== null || configChange){
forceLoad();
}
};
@Override
public void onCanceled(
List<AppModel> data) {
// TODO Auto-generated method stub
super.onCanceled(data);
cancelLoad();
}
@Override
protected void onReset() {
// TODO Auto-generated method stub
super.onReset();
onStopLoading();
if(mApps!=null){
//释放资源
mApps=null;
}
if(mPackageObserver!=null){
getContext().unregisterReceiver(mPackageObserver);
mPackageObserver=null;
}
}
}
代码说明:
(1)AppListLoader继承自AsyncTaskLoader,通过调用AndroidSDK提供的PackageManager的getInstalledApplications来获取应用列表;
(2)deliverResult:将结果发送到loader的监听器中。
3.2 核心代码(DetailsFragment.java):
public class DetailsFragment extends ListFragment implements OnQueryTextListener,LoaderCallbacks<List<AppModel>>{
MyFragmentDemoActivity.AppListAdapter mAdapter;
String mCurFilter;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
......
/**
* 创建loader
*/
public Loader<List<AppModel>> onCreateLoader(
int id, Bundle args) {
// TODO Auto-generated method stub
return new AppListLoader(getActivity());
}
/**
* Load 完成后
*/
public void onLoadFinished(
Loader<List<AppModel>> arg0,
List<AppModel> arg1) {
// TODO Auto-generated method stub
mAdapter.setData(arg1);
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
}
}
/**
* Loader 重置时
*/
public void onLoaderReset(
Loader<List<AppModel>> arg0) {
// TODO Auto-generated method stub
mAdapter.setData(null);
}
}
说明:
(1)自定义的Fragmeng继承自,实现了LoaderCallbacks;
(2)在onCreateLoader中,创建了AppListLoader;
(3)在onLoadFinished中,进行资源的释放和清理。
4 源代码传送门:
Fragment+Loader实现异步加载:
https://download.csdn.net/download/liranke/86334527