example consumir consume java android android-fragments android-asynctask

java - consumir - Fragmento fragmentado sin cabeza de Android



retrofit android (2)

Estoy leyendo sobre cómo interactuar entre la interfaz de usuario y el hilo de fondo aquí .

Este artículo tiene la siguiente nota:

AsyncTask no maneja los cambios de configuración automáticamente, es decir, si la actividad se recrea. El programador tiene que manejar eso en su codificación. Una solución común a esto es declarar AsyncTask en un fragmento retenido sin cabeza.

No entiendo lo que se conserva fragmento sin cabeza.

Por ejemplo, de esta manera puedo agregar fragmento:

FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(R.id.frame, new MyFragment()); transaction.commit();

Y en fragmento, puedo ejecutar AsyncTask así:

MyTask myTask = new MyTask(); String[] args = {"Hello"}; myTask.execute(args);

¿Se llama esto "declarar AsyncTask en un fragmento retenido sin cabeza"?


A medida que simplifiqué la complejidad en mi caso simplemente actualice su UI (si es necesario) verificando el fragmento de la llamada o si la actividad está presente o no. Inicie la asynctask asignando la referencia débil de la entidad llamante.


El fragmento sin cabeza no es más que un fragmento que no tiene vista. En onCreate() del fragmento lifeCycle, use setRetainInstance()true; . Esto no destruirá el fragmento incluso si la actividad se recrea. Entonces, si un AsyncTask se está ejecutando en fragmentos, en la recreación de la actividad, no perderá AsyncTask.

En onCreate de la actividad, debes agregar el fragmento con una etiqueta. Antes de agregar, compruebe si el fragmento existe utilizando getFragmentManager().findFragmentByTag(TAG) , si el fragmento es nulo, cree una nueva instancia del fragmento y agréguelo. En Fragment no habrá ninguna vista inflada, por lo que no es necesario anular onCreateView() .

Un ejemplo de Fragmento sin cabeza:

public class HeadlessProgressFragment extends Fragment { private ProgressListener mProgressListener; private AsyncTask<Void, Integer, Void> mProgressTask; public interface ProgressListener { void updateProgress(int progress); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } public void setProgressListener(Context context) { mProgressListener = (ProgressListener) context; } public void startProgress(final int size) { if (mProgressTask == null || mProgressTask.getStatus() != AsyncTask.Status.RUNNING || mProgressTask.getStatus() == AsyncTask.Status.FINISHED) { mProgressTask = new AsyncTask<Void, Integer, Void>() { @Override protected Void doInBackground(Void... params) { for (int index = 0; index < size; index++) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } finally { publishProgress(index + 1); } } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if (mProgressListener != null) { mProgressListener.updateProgress(values[0]); } } }; mProgressTask.execute(); } } }

En Activity Algo como esto:

public class MainActivity extends FragmentActivity implements HeadlessProgressFragment.ProgressListener { private static final String TAG = "progress_fragment"; private ProgressBar mProgressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dummy_view); mHeadlessProgressFragment = (HeadlessProgressFragment) getSupportFragmentManager().findFragmentByTag(TAG); if (mHeadlessProgressFragment == null) { mHeadlessProgressFragment = new HeadlessProgressFragment(); getSupportFragmentManager().beginTransaction().add(mHeadlessProgressFragment,TAG).commit(); } mHeadlessProgressFragment.setProgressListener(this); mRectFillingView = (ProgressRectFillingView) findViewById(R.id.progress_bar); final Button startFillBtn = (Button) findViewById(R.id.btn_start_filling); startFillBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mHeadlessProgressFragment.startProgress(100); } }); } @Override public void updateProgress(int progress) { mProgressBar.setProgress(progress); } }