Valor de retorno AsyncTask
Mi aplicación Android se conecta a mi sitio web para recuperar y cargar información, así que utilizo un hilo AsyncTask.
En un caso, necesito mi hilo para devolver un valor verdadero o un valor falso a mi hilo principal.
- DoInBackground llama a AsyncTask entonces duerme bloques UI Thread
- Actualización del diálogo de progreso en Activity from AsyncTask
- Retrofit 2 mejor práctica para android: solicitud asincrónica o solicitud síncrona en AsyncTask?
- Cómo utilizar Toast en ASyncTask / onPostExecute con cadena de recursos?
- Cargar archivos multipart con la librería Koush Ion
¿Hay una manera de obtener este valor de retorno de una función de ejecución AsyncTask?
Cuando hago lo siguiente:
Toast.makeText(Locate.this, "Testing : "+locationUpdate.execute(location), Toast.LENGTH_LONG).show();
Acabo de obtener un montón de gibberish.
Creo que lo que necesito es un medio para detener el hilo principal hasta que el segundo hilo termine. El segundo subproceso llama a una función en el subproceso principal para establecer mi valor de retorno. Por lo tanto, cuando el segundo hilo se completa, el hilo principal puede unpause y acceder al valor de retorno como establecido por el segundo hilo Si esta lógica es el sonido, por favor ofrezca sugerencias … gracias!
- ASyncTasks bloqueando a otros
- Developer.android.com/training proyecto bitmapfun
- Android: ¿Cómo puedo sincronizar datos del servidor a mi aplicación cada 3 y 5 minutos?
- Pasar parámetros a Asynctask
- Cómo detener el hilo de ASyncTask en android
- OnPostExecute en AsyncTask cancelado
- Android: Process.myTid () VS Thread.currentThread (). GetId ()
- Android: ¿puedes acceder a los miembros de la clase AsyncTask en DoInBackground?
Puede utilizar el método asyncTask get () para esto. Espera si es necesario para completar el cálculo y luego recupera su resultado:
Toast.makeText(Locate.this, "Testing : " + locationUpdate.execute(location).get(), Toast.LENGTH_LONG).show();
Pero asegúrese de no bloquear el hilo principal durante un largo período de tiempo, ya que esto conducirá a la falta de respuesta de la interfaz de usuario y ANR .
ACTUALIZAR
Perdí el punto de que la pregunta era sobre asíncrona web de descarga / carga. Web / operación de red debe considerarse como una larga y por lo tanto el enfoque "pausar hilo de interfaz de usuario y esperar hasta que finalice la descarga" siempre es un error. Utilice el método habitual de publicación de resultados en lugar (por ejemplo: AsyncTask.onPostExecute
, Service + sendBroadcast, bibliotecas como Volley, RoboSpice, DataDroid, etc.).
Handler es la mejor manera de hacerlo en el método onPostExcecute()
simplemente hacer
@Override protected void onPostExecute(Boolean bool) { super.onPostExecute(bool); Message msg=new Message(); msg.obj=bool; mHandler.sendMessage(msg); } }
Y su manejador de mensajes será
mHandler = new Handler() { @Override public void handleMessage(Message msg) { bool i=(String)msg.obj; } };
public class RunWebScript { String mString; public RunWebScript(String url){ try { URL updateURL = new URL(url); URLConnection conn = updateURL.openConnection(); // now read the items returned... InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(50); int current = 0; while((current = bis.read()) != -1){ baf.append((byte)current); } String s = new String(baf.toByteArray()); mString = s; } catch (Exception e) { Log.e("ANDRO_ASYNC", "exception in callWebPage",e); mString = "error"; } } public String getVal(){ return mString; }
}
Esto se ejecuta como … (mostrando el final de un método en la clase de llamada
asyncWebCall (url1,CONSTANT); } private void asyncWebCall(String url,int actionPostExecute){ new WebCall().execute(url,String.format("%d",actionPostExecute)); }
La parte Async de la empresa es … Nota la declaración de caso en onPostExecute esta es la clave para obtener el valor devuelto ito su programa de nuevo. Tenga en cuenta que la llamada new WebCall (). Execute (url, String.format ("% d", actionPostExecute)); Es lo último que se hace en un subproceso, no se pueden ejecutar más instrucciones, el control devuelve a través de onPostExecute.
class WebCall extends AsyncTask<String, String, String>{ int chooser = -1; @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(String... params) { try { chooser = Integer.parseInt(params[1]); } catch(NumberFormatException nfe) { Log.d("ANDRO_ASYNC",String.format("asyncReturn() mString numberformatexception = %s",params[1])); chooser = 0; } return(new RunWebScript(params[0])).getVal(); } protected void onProgressUpdate(String... progress) { } @Override protected void onPostExecute(String gotFromDoInBkgnd) { Log.d("ANDRO_ASYNC",String.format("chooser = %s",chooser)); switch (chooser){ case CONSTANT: printStringx(gotFromDoInBkgnd); asyncWebCall(url2,5); break; case 0: Log.d("ANDRO_ASYNC",String.format("case 0 = %s",gotFromDoInBkgnd)); break; case 5: Log.d("ANDRO_ASYNC",String.format("case 5 = %s",gotFromDoInBkgnd)); asyncWebCall(url3,7); break; default: Log.d("ANDRO_ASYNC",String.format("man we got problems = %s",gotFromDoInBkgnd)); break; } }
} // fin de la clase
Este es un ejemplo completo del problema de devolver valores de una tarea asíncrona. Puede ocurrir que hay muchas tareas que deben hacerse una tras otra asincrónicamente.
Lo esencial. 1. obtener un valor de retorno de una clase.
public class Snippet { int computVal; public Snippet(){ computVal = 17*32; } public int getVal(){ return computVal; }
}
Esto se llama como …
int hooray = (new Snippet()).getVal();