我正在使用支持库并使用AsyncTaskLoader
。为什么AsycTaskLoader
的构造函数不接受Fragment
作为参数?
我只希望AsyncTaskLoader
在我的片段中调用或初始化时开始加载数据。但截至目前,Activity随时转到onResume
,它会重新启动我在不同片段上初始化的所有加载器。我相信这主要是因为我在我的AsyncTaskLoader实例的构造函数中传递fragment.getActivity()
。
有什么办法吗?
到目前为止,我在一个片段中包装加载器的初始化,每个都有一个内部的AsyncTaskLoader,我也自定义了。然后在片段初始化时,在onCreateView
方法中,我然后调用方法:
initLoader();
initLoader()
方法
public Loader<Object> initLoader() {
return getLoaderManager().initLoader(LOADER_ID.DUMMIES, null, new LoaderCallbacks<Object>() {
@Override
public Loader<Object> onCreateLoader(int id, Bundle args) {
Loader<Object> loader = new CustomLoader<Object>(getActivity()) {
@Override
public Object loadInBackground() {
return DummyGenerator.generateDummyEntriesToDb();;
}
};
return loader;
}
@Override
public void onLoadFinished(Loader<Object> loader, Object data) {
setToDb(data);
}
@Override
public void onLoaderReset(Loader<Object> loader) {
}
});
}
CustomLoader.java
- 通用实施我适合我的需要。 releaseResources
方法未填写,但我将其留在那里以备将来使用。
public class CustomLoader<T> extends AsyncTaskLoader<T> {
T mData;
public CustomLoader(Context context) {
super(context);
}
@Override
public T loadInBackground() {
return null;
}
@Override
public void deliverResult(T data) {
if (isReset()) {
releaseResources(data);
return;
}
T oldData = mData;
mData = data;
if (isStarted()) {
super.deliverResult(data);
}
if (oldData != null && oldData != data) {
releaseResources(oldData);
}
}
@Override
protected void onStartLoading() {
if (mData != null) {
deliverResult(mData);
}
if (takeContentChanged() || mData == null) {
forceLoad();
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
@Override
protected void onReset() {
onStopLoading();
if (mData != null) {
releaseResources(mData);
mData = null;
}
}
@Override
public void onCanceled(T data) {
super.onCanceled(data);
releaseResources(data);
}
public void releaseResources(T data) {
}
}
generateDummyEntriesToDb
方法正常工作,只创建我正在使用的对象列表,以及setToDb()
方法。问题是当活动转到onResume
时再次调用loadnBackground()
方法,因此我不得不认为所有其他加载器的行为方式相同。
答案 0 :(得分:1)
提供的Context
应该是Activity
附加的Fragment
。确保通过LoaderManager
初始化加载程序,因为它与相应的对象生命周期相关联。因此,当从Fragment
内进行初始化时,您应该使用Fragment.getLoaderManager()
。然后适当地致电LoaderManager.initLoader()
。