Android Loaders不会调用onLoadFinished

时间:2013-08-14 13:51:11

标签: android android-loadermanager android-loader

我在使用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());
    }
}

}

1 个答案:

答案 0 :(得分:0)

所以我刚遇到这个问题,不确定这是否与你的情况有关,但如果你的加载器都使用相同的id(第一个param传递给restartLoader或initLoader方法),它们将重新启动并踩到每个另外,当分页比另一个花费更长时间。希望这仍然与遇到此问题的人有关!