Как мне управлять жизненным циклом фрагмента и FragmentPagerAdapter - PullRequest
4 голосов
/ 02 апреля 2012

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

Моя цель - вызвать AsyncTask видимого фрагмента, когда пользователь перелистывает его в поле зрения.

На данный момент я только смог создать приложение, которое при запуске кода FragmentPagerAdapter создает все фрагменты, которые я хотел бы иметь в наличии, одновременно завершая полный жизненный цикл запуска каждого фрагмента.

Мне бы хотелось, чтобы AsyncTask фрагмента срабатывал, когда фрагмент появлялся в поле зрения, и отменял его, когда он выходил из поля зрения. Я попытался переопределить все доступные обратные вызовы для каждого фрагмента, но мне еще не удалось найти обратный вызов или прослушиватель, который реагирует, когда конкретный фрагмент отображается / не отображается.

Я использую пакет поддержки Android v4 с ViewPager в качестве базы для приложения.

1 Ответ

3 голосов
/ 02 апреля 2012

Вы, наверное, ищете .setOnPageChangedListener() -метод.Либо вызовите mViewPager.setOnPageChangedListener(new OnPageChangedListener() { ... }) или implement ViewPager.OnPageChangedListener в своем адаптере (и установите mViewPager.setOnPageChangedListener(mAdapter)).

В методе onPageSelected() выполните асинхронную задачу и отмените все предыдущие экземпляры.Таким образом, ваша асинхронная задача будет выполнена, когда ваша страница (полностью) видна.Если вы хотите выполнить его, как только пользователь начнет прокручивать, вместо этого манипулируйте методами onPageScrollStatechanged() и onPageScrolled().

Пример:

viewPager.setOnPageChangeListener(new OnPageChangeListener() {

    @Override
    public void onPageScrollStateChanged(int state) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPageSelected(int position) {

        // check if asyncTask exists and is running; if so, cancel it.
        if(mAsyncTask != null) {

            if(mAsyncTask.getStatus() != AsyncTask.Status.FINISHED) {
                mAsyncTask.cancel(true); // cancel asynctask if activity is destroyed before it's finished
            }

            mAsyncTask = null;
        }

        mAsyncTask = new MyAsyncTask().execute("myParam"); 
    }

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...