我在使用ViewPager管理的片段中使用AsyncTaskLoaders时遇到问题。 配置如下:
片段#1 - 从磁盘加载图片的加载器 Fragment#2 - 从磁盘加载自定义对象的Loader Fragment#3 - 从网络加载JSON对象的Loader 片段#4 - 作为#3
如果我在片段#1中省略了Loader,那就没问题了。 但是如果我尝试在片段#1中使用Loader,那么所有其他Loader都不会调用每个片段中指定的onLoadFinished回调。我放了一些Log,我看到所有其他的加载器都正确处理了loadInBackground()方法,但之后它们处于重置状态。
可能同时有最大数量的加载器可用,或者加载位图的大小是否存在问题?
每个片段都需要在 onCreateView()回调中初始化加载器
getLoaderManager().initLoader(STATS_LOADER_ID, null, this);
并实现 LoaderManager.LoaderCallbacks 作为
@Override
public Loader<UserStats> onCreateLoader(int arg0, Bundle arg1) {
ProfileStatsLoader loader = new ProfileStatsLoader(getActivity(), userId);
loader.forceLoad();
return loader;
}
@Override
public void onLoadFinished(Loader<UserStats> loader, UserStats stats) {
Log.d(TAG, "onLoadFinished");
postLoadUI((ProfileStatsLoader) loader, stats);
}
@Override
public void onLoaderReset(Loader<UserStats> arg0) {
Log.d(TAG, "onLoaderReset");
}
第一个Loader(可能是其余三个代码失败的原因)代码是
public class ProfilePictureLoader extends AsyncTaskLoader<Bitmap> {
private static final String TAG = ProfilePictureLoader.class.getCanonicalName();
private User user;
private int maxSize;
private Bitmap bitmap;
private Throwable error;
public ProfilePictureLoader(Context context, User user, int maxSize) {
super(context);
this.user = user;
this.maxSize = maxSize;
}
public Throwable getError() {
return error;
}
public Bitmap getPicture() {
return bitmap;
}
@Override
public Bitmap loadInBackground() {
Log.d(TAG, "Loading bitmap for user " + user.getUuid());
Log.w(TAG, "Is reset at start? " + this.isReset());
ImageUtils iu = new ImageUtils(getContext());
String localProfilePicturePath = iu.loadBitmapURIForUser(user.getUuid());
// if the user has not a picture saved locally (for logged user) neither
// have never set a profile picture (for online users), return a null
// bitmap
if (localProfilePicturePath == null && !user.hasProfilePicture())
return null;
try {
if (user.isStoredLocally()) {
// load local profile image
bitmap = null;
if (localProfilePicturePath != null)
// load profilePictureMaxSize px width/height
bitmap = ImageUtils.decodeSampledBitmapFromPath(localProfilePicturePath, maxSize, maxSize);
} else {
// download remotely
bitmap = UserRESTClient.downloadUserPicture(user.getUuid(), UserRESTClient.PICTURE_MEDIUM_SIZE);
}
return bitmap;
} catch (Throwable t) {
Log.e(TAG, "Error loading bitmap for user " + user.getUuid() + ": " + t);
t.printStackTrace();
error = t;
return null;
}finally{
Log.w(TAG, "Is reset? " + this.isReset());
}
}
}
答案 0 :(得分:0)
所以我刚遇到这个问题,不确定这是否与你的情况有关,但如果你的加载器都使用相同的id(第一个param传递给restartLoader或initLoader方法),它们将重新启动并踩到每个另外,当分页比另一个花费更长时间。希望这仍然与遇到此问题的人有关!