Несколько AsyncTaskLoader в одном действии - каждый ли загрузчик должен быть инициализирован в onCreate? - PullRequest
6 голосов
/ 18 ноября 2011

У меня есть FragmentActivity с ViewPager в нем - этот ViewPager содержит три ListViews, каждый из которых должен иметь свои собственные уникальные адаптеры (и уникальные наборы данных).

Я хотел бы использовать AsyncTaskLoader для заполнения этих адаптеров, но ТОЛЬКО при выборе данного представления в ViewPager.

Требуется ли запускать загрузчик в методе действия onCreate? (код ниже)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_foo);

    getSupportLoaderManager().initLoader(0, null, this);
    getSupportLoaderManager().initLoader(1, null, this);
    getSupportLoaderManager().initLoader(2, null, this);
}

Или это нормально вызывать вызов initLoader (...) в интерактивном режиме, например, в результате прослушивателя OnPageChangeListener.onPageSelected?

mPager.setOnPageChangeListener(new OnPageChangeListener() {
    @Override
    public void onPageSelected(int newPage) {
        getSupportLoaderManager().initLoader(newPage, null, this);
    }

    ...
}

Я хочу, чтобы вам не приходилось запускать потенциально 3-х часовые загрузчики сразу, если пользователь может только смотреть на первый вид в пейджере.

РЕДАКТИРОВАТЬ: Или было бы лучше, чтобы ViewPager использовал Фрагмент для каждого представления, и каждый фрагмент будет отвечать за управление своим собственным загрузчиком?

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Поскольку вы уже используете фрагменты, я бы предложил использовать фрагменты в вашем пейджере.Я делаю, и это работает намного лучше.Тогда действительно вы инициализируете один загрузчик на фрагмент.Если эти фрагменты связаны, вы можете определить абстрактное расширение и разместить там общую логику инициализации, а затем расширить ее, чтобы создать конкретный фрагмент

. В вашем коде выше я обнаружил, что инициализация каждого последующего загрузчика отменяет выполнениепредыдущего даже идентификаторы разные

1 голос
/ 18 ноября 2011

Я не помню деталей, но, по крайней мере, с библиотекой совместимости, если вы не позвоните initLoader() из onCreate(), жизненный цикл загрузчика будет испорчен, так что вы можете вызвать их из onCreate() (может быть исправлено в последней версии, не проверено).IIRC, фрагменты просто используют LoaderManager действия, поэтому загрузчики всегда управляются действием.Использование фрагментов обычно делает ваш код чище, поэтому переходите к фрагментам, если это возможно.

...