¿Cómo se maneja AsyncTask en los fragmentos ActionBarActivity cuando se utiliza ViewPager?

Estoy usando ActionBarActivity para crear 5 tabs. He usado ViewPager para deslizar entre las 5 tabs usando SectionsPagerAdapter que extiende FragmentPagerAdapter. Cada pestaña tiene un fragmento con una asynctask llamada en el método oncreateview. Cuando estoy en un fragmento, se llama a asynctask en otro fragmento.

Traté de usar mensajes de pan tostado en el método oncreateview es cada fragmento en lugar de asynctask. Pero los mensajes de pan tostado incorrectos se disparan en fragmentos incorrectos.

Código de método Oncreate:

mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); mViewPager = (ViewPager) findViewById(R.id.pager_exp); mViewPager.setAdapter(mSectionsPagerAdapter); mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); actionBar.setTitle(getHomePageTitle(position)); } }); for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { // Create a tab with text corresponding to the page title defined by // the adapter. Also specify this Activity object, which implements // the TabListener interface, as the callback (listener) for when // this tab is selected. actionBar.addTab(actionBar.newTab() .setIcon(getPagedrawable(i)) .setTabListener(this)); } 

// Código de clase del adaptador:

 public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: Fragment1 f1 = new Fragment1(); return f1; case 1: Fragment2 f2 = new Fragment2(); return f2; case 2: Fragment3 f3 = new Fragment3(); return f3; case 3: Fragment4 f4 = new Fragment4(); return f4; case 4: Fragment5 f5 = new Fragment5(); return f5; } return null; } @Override public int getCount() { // Show 5 total pages. return 5; } } 

Código de clase Fragemnt:

 public class F1 extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @SuppressLint("NewApi") @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflater.inflate(R.layout.f1,container, false); Toast.makeText(getActivity(), "F1", Toast.LENGTH_SHORT).show(); return view; } } 

FragmentPagerAdapter guarda fragmentos adicionales, además del que se muestra, en estado reanudado. La solución es implementar un OnPageChangeListener personalizado y crear un nuevo método para cuando se muestre el fragmento.

1) Crear interfaz LifecycleManager La interfaz tendrá dos métodos y cada Fragmento ViewPager's lo implementará. Estos métodos son los siguientes:

 public interface FragmentLifecycle { public void onPauseFragment(); public void onResumeFragment(); } 

2) Permitir que cada Fragment implemente la instrucción de complementos de interfaz para cada statement de clase:

 public class FragmentBlue extends Fragment implements FragmentLifecycle public class FragmentGreen extends Fragment implements FragmentLifecycle public class FragmentPink extends Fragment implements FragmentLifecycle 

3) Implementar métodos de interfaz en cada fragmento. Para comprobar que realmente funciona como se espera, simplemente registraré la llamada al método y mostraré Toast:

 @Override public void onPauseFragment() { Log.i(TAG, "onPauseFragment()"); Toast.makeText(getActivity(), "onPauseFragment():" + TAG, Toast.LENGTH_SHORT).show(); } @Override public void onResumeFragment() { Log.i(TAG, "onResumeFragment()"); Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show(); } 

4) Métodos de interfaz de llamada en el cambio de página de ViewPager. Puede configurar OnPageChangeListener en ViewPager y obtener una callback cada vez que ViewPager muestre otra página:

 pager.setOnPageChangeListener(pageChangeListener); 

5) Implemente OnPageChangeListener para llamar a sus métodos personalizados de Lifecycle

El oyente conoce la nueva posición y puede llamar al método de interfaz en el nuevo Fragmento con la ayuda de PagerAdapter. Aquí puedo invocar onResumeFragment () para el nuevo fragmento y onPauseFragment () en el actual.

Necesito almacenar también la posición del fragmento actual (inicialmente la posición actual es igual a 0), ya que no sé si el usuario se desplazó de izquierda a derecha o de derecha a izquierda. Vea lo que quiero decir en el código:

 private OnPageChangeListener pageChangeListener = new OnPageChangeListener() { int currentPosition = 0; @Override public void onPageSelected(int newPosition) { FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition); fragmentToShow.onResumeFragment(); FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition); fragmentToHide.onPauseFragment(); currentPosition = newPosition; } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } public void onPageScrollStateChanged(int arg0) { } }; 

No escribí el código. Tutorial completo aquí: http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/

Utilizar esta

 viewPager.setOffscreenPageLimit(1); // the number of pages you want to load in background 

y también un ProgressDialogue .

ViewPager crea vistas para fragmentos adyacentes a su página actual. Esto también le da la oportunidad de cargar cualquier dato requerido para los fragmentos adyacentes. Si está utilizando AsyncTasks para cargar datos, usar esta característica dará como resultado una mejor experiencia de usuario. Pero si necesita un evento cuando el visor abre una página en particular, la solución de LordRaydenMK funcionará.

Ver mi publicación en el siguiente hilo para usar AsyncTasks en un ViewPager:

AsyncTask se ejecuta en cada página de ViewPager

Hola, puedes probar usando la etiqueta de cada fragmento y el método de llamada de cada fragmento en la página modificada

 mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); actionBar.setTitle(getHomePageTitle(position)); Fragment f = getFragrmentManager().findFragmentByTag( "" + position); if (f != null) f.refresh(); } }); 

y en

  @Override public Fragment getItem(int position) { Fragment f=null; switch (position) { case 0: f = new Fragment1(); break; case 1: f = new Fragment2(); break; case 2: f = new Fragment3(); break; case 3: f = new Fragment4(); break; case 4: f = new Fragment5(); break; } f.setTag(""+position); return f; }