OnLoadFinished() загрузчика на соседних страницах не вызывается, пока представление не будет воссоздано
У меня возникают трудности с правильной реализацией загрузчиков. Я прочитал много статей и сообщений от stackru и пробовал разные вещи. Но ничто еще не решило эту проблему. Я использую view pager с библиотекой PagerSlidingTabStrip для создания макета с 3 вкладками (используя FragmentPagerAdapter). И я использую 3 отдельных загрузчика для загрузки данных для этих 3 вкладок.
Проблема заключается в том, что когда я впервые загружаю свое приложение, смежные вкладки не вызывают loadInBackground(), пока я не прокручиваю до этих вкладок, хотя FragmentPagerAdapter успешно создает смежные фрагменты. Как ни странно, когда я поворачиваюсь или нажимаю home и снова открываю приложение, начинают загружаться соседние вкладки. Это означает, что если представление будет уничтожено и воссоздано, загрузка начнется.
Я также попытался использовать startLoading для загрузчиков во всех 3 фрагментах (я считаю, что мой метод OnStartLoading правильно настроен. Я вызываю forceLoad() в этом методе). Если я использую startLoading, то вызывается loadInBackground(). И все же onLoadFinished() нет! И поэтому мой вид все еще показывает пустой спиннинг загрузчик, пока я не перейду к соседней вкладке.
Таким образом, вкратце, независимо от того, вызывается ли loadInBackground() или нет, onLoadFinished() для соседних страниц не вызывается до тех пор, пока представление не будет воссоздано. (или, конечно, если я просто перейду на эти страницы)
Кто-нибудь сталкивался с подобной проблемой? Я чувствую, что перепробовал все, что мог, и понятия не имею, как решить эту проблему.
Вот мой onCreateView():
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.movie_grid, container, false);
LoaderManager lm = getLoaderManager();
lm.restartLoader(CONFIG_LOADER, null, new ConfigurationLoaderCallbacks());
lm.restartLoader(MOVIE_DATA_LOADER, null, new MovieDataLoaderCallbacks());
...
return v;
}
Мой абстрактный класс AsyncTaskLoader:
private D mData;
public DataLoader(Context context) {
super(context);
}
@Override
protected void onStartLoading() {
if (mData != null) {
deliverResult(mData);
} else {
forceLoad();
}
}
@Override
public void deliverResult(D data) {
mData = data;
if (isStarted())
super.deliverResult(data);
}
Мой onResume():
public void onResume() {
super.onResume();
// Call this to re-connect with an existing loader
LoaderManager lm = getLoaderManager();
if (lm.getLoader(MOVIE_DATA_LOADER) != null) {
lm.initLoader(MOVIE_DATA_LOADER, null, new MovieDataLoaderCallbacks());
}
if (lm.getLoader(CONFIG_LOADER) != null) {
lm.initLoader(CONFIG_LOADER, null, new ConfigurationLoaderCallbacks());
}
}