uso studio onpreexecute oncancelled method manejo implement definicion asynctask android android-asynctask return-value

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); } }