一.写一个Loader继承AsyncTaskLoader例子如下:
public class
ModelLoader
extends
AsyncTaskLoader<L
ist<Model>> {
public
ModelLoader(Context context) {
super (context);
super (context);
}
public
List<Model> loadInBackground() {
return null
;
}
}
Model为实体类,作为存储数据用
二.重写AsyncTaskLoader的方法:
deliverResult、onStartLoading、onStopLoading、onCanceled、onReset、onReleaseResources
如下:
public void
deliverResult(
L
ist<Model>
data) {
if
(isReset()) {
if
(data !=
null
) {
onReleaseResources(data);
}
onReleaseResources(data);
}
}
L
ist<Model>
oldData = data;
if
(isStarted()) {
super
.deliverResult(data);
}
if
(oldData !=
null
) {
onReleaseResources(oldData);
}
}
onReleaseResources(oldData);
}
}
// 开始Loader;很重要,必须写
protected void
onStartLoading() {
if (
data
!=
null
) {
deliverResult(
data
);
}
}
if (takeContentChanged() ||
data
== null) {
forceLoad();
}
}
}
}
// 停止Loading
protected void
onStopLoading() {
// Attempt to cancel the current load task if possible.
cancelLoad();
}
// Attempt to cancel the current load task if possible.
cancelLoad();
}
// 当Loader被取消,释放资源
public void
onCanceled(
L
ist<Model>
apps) {
super
.onCanceled(apps);
onReleaseResources(apps);
}
}
// 当Loader重置
protected void
onReset() {
super .onReset();
onStopLoading();
if
(
data
!=
null
) {
onReleaseResources( data );
data = null ;
}
}
onReleaseResources( data );
data = null ;
}
}
// 当资源被释放
protected void
onReleaseResources(
L
ist<Model>
apps) {
}
三.在Activity或Fragment中使用getLoaderManger()
获取LoaderManager对象,调用initLoader(int, Bundle, Context)方法
以Fragment为例子如下:
public void
onActivityCreated(Bundle savedInstanceState) {
super .onActivityCreated(savedInstanceState);
// 使用this后Fragment要实现
LoaderManager.LoaderCallbacks<List<Model>>接口
getLoaderManager().initLoader(0
, null, this);
}
// 实现LoaderCallbacks接口方法
public
Loader<List<Model>> onCreateLoader(
int
id, Bundle args) {
return new
ModelLoader(getActivity());
}
public void
onLoadFinished(Loader<List<Model>> loader, List<Model> data) {
// 获取
ModelLoader中
loadInBackground方法的返回值
data
// 对data进行处理,写写Adapter之类的
}
public void
onLoaderReset(Loader<List<Model>> loader) {
}
四.改造加强
每次都需要重写
AsyncTaskLoader中的
deliverResult、onStartLoading、onStopLoading、
onCanceled、onReset、onReleaseResources方法,未免过于太笨重,我们可以写一个万能
的
AsyncTaskLoader,及继承了
AsyncTaskLoader的Loader-->定义为CommonLoader,当要
用到的时候直接继承
CommonLoader。
附代码:
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.AsyncTaskLoader;
public class CommonLoader<T > extends AsyncTaskLoader<T> {
private T data ;
public CommonLoader(Context context) {
super (context);
}
private T data ;
public CommonLoader(Context context) {
super (context);
}
public T loadInBackground() {
return null ;
}
return null ;
}
public void deliverResult(T data) {
if (isReset()) {
if (data != null) {
onReleaseResources(data);
}
}
T oldData = data;
onReleaseResources(data);
}
}
T oldData = data;
if (isStarted()) {
super.deliverResult(data);
}
if (oldData != null) {
onReleaseResources(oldData);
}
}
onReleaseResources(oldData);
}
}
protected void onStartLoading() {
if (data != null) {
deliverResult( data);
}
}
if (takeContentChanged() || data == null) {
forceLoad();
}
}
}
}
protected void onStopLoading() {
cancelLoad();
}
}
public void onCanceled(T apps) {
super .onCanceled(apps);
onReleaseResources(apps);
}
protected void onReset() {
super .onReset();
onStopLoading();
if (data != null) {
onReleaseResources(data);
data = null;
}
onReleaseResources(data);
data = null;
}
}
protected void onReleaseResources(T apps) {
}
}
}
需要例子的可以直接找我要例子
QQ:1018433564 小江来了
Wechat:jym-555 江奕铭