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?