android - studio - Devuelve el valor de la clase AsyncTask en el método PostExecute
oncancelled asynctask android (3)
Crea una interfaz como OnCompletRequest()
luego pasa esto a tu constructor de ClassB y simplemente llama al método dentro de esta interfaz, como complete(yourList list)
en el método de onPostExecute(String result)
Ok, ahora tengo la Class A
que contiene algunos spinners que los valores serán poblados por la Class B
que amplía AsnycTask
que toma los valores del spinner de un servicio web. En la clase B logro recuperar los valores, que se muestran en un Toast. El problema ahora es ¿cómo paso esos valores de spinner a la Clase A?
He intentado
¿Puede el método OnPostExcecute en los valores de RETORNO AsyncTask?
pasando Class A
a Class B
y almacenando el valor en una variable pública de Class A
como abajo
@Override
protected void onPostExecute(String result)
{
classA.classAvariable = result;
}
Sin embargo, cada vez que trato de leer la classAvariable
siempre obtengo una NullPointer Exception
. Parece que la variable nunca fue asignada con el resultado. Para fines de legibilidad, necesité separar Class B
lugar de usar como una clase en línea.
¿Alguna idea de mis compañeros programadores de Java?
El problema aquí es que cuando ejecutas tu AsynchTask, su metodo doInBackground () se ejecuta en un subproceso separado y el subproceso que ha iniciado este AsynchTask avanza, por lo tanto, los cambios se producen en tu variable por AsynchTask no se refleja en el subproceso principal (que declaró este AsynchTask) inmediatamente.
Ejemplo -
class MyAsynchTask
{
doInbackground()
{
a = 2;
}
}
int a = 5;
new MyAsynchTask().execute();
// aquí todavía hay 5
Supongo que estás tratando de leer la variable de la clase A antes de que se establezca. Intenta hacerlo usando devoluciones de llamadas. En la función de devolución de llamada, pasa los valores y actualiza tus spinners.
Puede crear una interface
, pasarla a AsyncTask
(en constructor) y luego llamar al método en onPostExecute
Por ejemplo:
Su interfaz:
public interface OnTaskCompleted{
void onTaskCompleted(values);
}
Tu actividad:
public YourActivity implements OnTaskCompleted{
//your Activity
YourTask task = new YourTask(this); // here is the initalization code for your asyncTask
}
Y tu AsyncTask:
public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type
private OnTaskCompleted listener;
public YourTask(OnTaskCompleted listener){
this.listener=listener;
}
//required methods
protected void onPostExecute(Object o){
//your stuff
listener.onTaskCompleted(values);
}
}