studio publishprogress oncancelled example doinbackground create asynctask java android android-fragments android-asynctask

java - publishprogress - extends asynctask



Fragmentos, AsyncTask y Oyentes (1)

El problema radica en esta pieza de código

private void setData(){ someListView.setAdapter(new SomeAdapter(getActivity(), data)); }

Cuando cierras la actividad, puede morir en el fondo. Cuando la Asynctask finaliza y se llama a la función SetData desde el oyente, obtiene nulo para getActivity () ya que ha sido destruido por el sistema operativo. Compruebe si getActivity () es nulo antes de configurar el adaptador.

Esto es algo que he tenido problemas recientemente. Algunas veces, después de salir de la aplicación usando el botón de inicio y dejarla reposar de manera ociosa en el fondo por un tiempo, obtengo un puntero nulo para getActivity (). Así que me pregunto si estoy configurando una tarea asincrónica y si los oyentes están equivocados o tal vez el problema esté en otro lado. Mi procedimiento general es el siguiente:

public class MyAsyncTask extends AsyncTask<Void, Void, List<SomeObject>>{ private Context ctx; private AsyncListener listener; public MyAsyncTask(Context ctx){ //set Context, etc } ... onPostExecute(List<SomeObject> result){ super.onPostExecute(result); if(result!=null){ listener.onAvailable(result); } else { listener.onUnavailable(); } } public interface AsyncListener{ void onAvailable(List<SomeObject> result); void onUnavailable(); } public void setAsyncListener(AsyncListener listener){ this.listener = listener; } }

Fragmento:

public class MyFragment extends Fragment implements AsyncListener { private AsyncTask task; private List<SomeObject> data; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return inflater.inflate(R.layout.fragment_messages, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); setViews(); if(data == null) { task = new AsyncTask(getActivity()); task.setAsyncListener(this); task.execute(); } else { setData(); } } private void setData(){ someListView.setAdapter(new SomeAdapter(getActivity(), data)); } @Override public void onAvailable(List<SomeObject> result){ this.data = result; setData(); } @Override public void onUnavailable(List<SomeObject> result){ //Create toast or alert dialog, etc } }

Como puede ver, utilizo oyentes para publicar el resultado de asynctask en mi fragmento. El problema es que a veces recibo un puntero nulo en getActivity () cuando establezco el adaptador. Esto solo ocurre si salgo de la aplicación, lo dejo en segundo plano durante un período prolongado y luego lo abro. ¿Quizás el oyente se activa antes de que se adjunte Fragmento? Tal vez tengo que establecer mi lógica de una manera diferente?