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());
    }
}

0 ответов

Другие вопросы по тегам