如何将 AsyncTaskLoader 绑定到 Fragment 的生命周期?
How can I tie an AsyncTaskLoader to a Fragment's lifecycle?
我正在使用支持库和 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()
方法。问题是当 activity 转到 onResume
时, loadnBackground()
方法再次被调用,因此我不得不认为所有其他加载器的行为方式相同。
提供的 Context
应该是附加到 Fragment
的 Activity
。请确保您正在通过 LoaderManager
初始化加载程序,因为它与适当的对象生命周期相关联。所以当从 Fragment
中初始化时,你应该使用 Fragment.getLoaderManager()
。然后适当调用LoaderManager.initLoader()
。
我正在使用支持库和 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()
方法。问题是当 activity 转到 onResume
时, loadnBackground()
方法再次被调用,因此我不得不认为所有其他加载器的行为方式相同。
提供的 Context
应该是附加到 Fragment
的 Activity
。请确保您正在通过 LoaderManager
初始化加载程序,因为它与适当的对象生命周期相关联。所以当从 Fragment
中初始化时,你应该使用 Fragment.getLoaderManager()
。然后适当调用LoaderManager.initLoader()
。