Search code examples
androidloaderasynctaskloader

Loader is not allways firing onLoadFinished callback


Im using AsyncTaskLoader to fetch data from web api but in some reason, loader is not firing always onLoadFinished callback.

Here is snippt from my Fragment, how I use the loader. Im always restarting loader restartLoader(...).forceload() to update the result. The loader is fired based on user interaction.

private void getData() {
    Bundle bundle = new Bundle();
    bundle.putParcelable("userInput", mUserInputData);
    getLoaderManager().restartLoader(CARS_LOADER_ID, bundle, carsLoaderListener).forceLoad();
}


private LoaderManager.LoaderCallbacks<List<Car>> carsLoaderListener = new LoaderManager.LoaderCallbacks<List<Car>>()
{
    @Override
    public Loader<List<Car>> onCreateLoader(int id, Bundle args)
    {;
        return new CarsLoader(getActivity(), (UserInput)args.get("userInput"));
    }

    @Override
    public void onLoadFinished(Loader<List<Car>> loader, List<Car> data)
    {
        // This is not allways get called
        setData(data);
    }

    @Override
    public void onLoaderReset(Loader<List<Car>> loader)
    {
    }
};

Is it ok to restart loader like this even if it is already running? Can that lead to case where loader get jammed? Sometimes the loader is fired ok and it is doing the work, but it newer fires onLoadFinished callback. When the loader gets jammed like this restartign the fragment / closing the app fixes the issue.


Solution

  • I also experienced this kind of problem. I am not sure whether its bug in LoaderManager.RestartLoader or anything else but getLoaderManager().destroyLoader(Loader_id) and then getLoaderManager().initLoader() worked for me.

    Hope this helps.