我正在使用支持库和 AsyncTaskLoader
。为什么 AsycTaskLoader
的构造函数不接受 Fragment
作为参数?
我只希望 AsyncTaskLoader
在我的 fragment 中被调用或初始化时开始加载数据。但截至目前,只要 Activity 转到 onResume
,它就会重新启动我在不同 fragment 上初始化的所有加载器。我相信这主要是因为我在 AsyncTaskLoader 实例的构造函数中传递了 fragment.getActivity()
。
有什么办法吗?
到目前为止,我将加载器的初始化包装在一个 fragment 中,并且每个 fragment 都有一个内部 AsyncTaskLoader,我也对其进行了自定义。然后,当 fragment 初始化时,在 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()
方法。问题是当 Activity 进入 onResume
时,再次调用 loadnBackground()
方法,因此我不得不认为所有其他加载器的行为方式相同。
最佳答案
提供的Context
应该是附加到Fragment
的Activity
。请确保您正在通过 LoaderManager
初始化加载程序,因为它与适当的对象生命周期相关联。因此,当从 Fragment
中初始化时,您应该使用 Fragment.getLoaderManager()
。然后适本地调用 LoaderManager.initLoader()
。
关于android - 如何将 AsyncTaskLoader 绑定(bind)到 Fragment 的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33072766/