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.
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.