¿Cómo cancelar un Android AsyncTask después de una cierta cantidad de tiempo? (Por ejemplo, 10 segundos)
Quiero utilizar un AsyncTask para comprobar un InetAddress, como en el código de abajo. La variable tempInet es una variable global que indica si el sitio web fue contactable o no.
Comienzo el AsyncTask con el código … new InetAsyncTask (). Execute ("www.facebook.com");
- Android: el resultado de AsyncTask no se devuelve a la actividad principal
- ¿Cómo utilizar AsyncTask para mostrar un ProgressDialog mientras realiza un trabajo de fondo en Android?
- Ejecutar tareas en backgound en NativeScript
- AsyncTask matar tarea al pulsar el botón de nuevo
- Asíntate un comportamiento extraño
Mi problema es que quiero que el AsyncTask se cancele después de (digamos) 10 segundos.
Algunas otras preguntas sugieren usar el método get (10, TimeUnit.SECONDS). Me gustaría hacer esto pero no sé dónde / cómo poner el método get. ¿Con ejecutar? ¿En el método doInBackground?
Además, ¿el método get () bloquea el subproceso principal? Si lo hace, ¿cuál es el punto de ella?
Cualquier ayuda apreciada.
class InetAsyncTask extends AsyncTask<String, String, Boolean> { @Override protected Boolean doInBackground(String... params) { try { InetAddress.getByName("www.facebook.com"); return true; } catch (UnknownHostException e) { return false; } } //end doInBackground function protected void onPostExecute(Boolean... result) { tempInet = result[0]; } } //end class
preguntas relacionadas
Android – ¿Configurar un tiempo de espera para un AsyncTask?
Detener la tarea asíncrona después de 60 segundos
Desarrolladores de Android AsyncTask Documentación
Http://developer.android.com/reference/android/os/AsyncTask.html
- Getting java.lang.IllegalStateException: El thread actual debe tener un looper
- Problema de corrupción de bases de datos precargado en la aplicación de Android
- Android - Detener AsyncTask cuando se pulsa el botón Atrás y volver a Actividad anterior
- ¿Debo usar AsyncTask o IntentService para mi aplicación?
- Conceptos básicos de Android: ejecutar código en el subproceso de la interfaz de usuario
- De error de memoria durante el uso de viewpager + imageview incluso cuando se utiliza la memoria caché y asynctask
- ¿Necesita httpClient en AsyncTask wakeLock?
- Cómo restablecer el ListView con el ArrayAdapter después de buscar datos
Debe hacer un controlador que cancela el Asynctask (http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean))
Enviar un mensaje retrasado a este controlador como:
Handler.sendMessageDelayed(msg, delayMillis) private android.os.Handler mHandler = new android.os.Handler() { @Override public void handleMessage(Message msg) { (Your AsyncTask object).cancel(true); } }
Para responder tu pregunta. El código para usar con get () es el siguiente:
Boolean isHost = new AsyncTask<String, Void, Boolean>() { @Override protected Boolean doInBackground(String... params) { try { InetAddress.getByName(params[0]); return true; } catch (UnknownHostException e) { return false; } } }.execute("www.facebook.com").get(PING_TIME, TimeUnit.MILLISECONDS);
El método get bloquea el hilo de la persona que llama, siempre y cuando el resultado deba ser devuelto. Por lo tanto, sólo debe utilizarlo en situaciones de prueba. Si desea obtener una respuesta asíncrona, inicie lo siguiente (este es uno de mis ejemplos, tendrá que cambiarlo para su propósito):
private AsyncTask<Void, Void, Boolean> mAsyncTask; private android.os.Handler timeHandler = new android.os.Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // react here or... mAsyncTask.cancel(true); } }; public void pingServer() { timeHandler.sendEmptyMessageDelayed(1, PING_TIME); mAsyncTask = new AsyncTask<Void, Void, Boolean>() { @Override protected Boolean doInBackground(Void... params) { // stop the time handler timeHandler.removeMessages(1); return restService.pingServer(); } @Override protected void onPostExecute(Boolean isOnline) { super.onPostExecute(isOnline); // use result after execution (eg: send to callback) } @Override protected void onCancelled(Boolean aBoolean) { super.onCancelled(aBoolean); // ...react here } }.execute(); }
- ¿Es posible escanear el androide classpath para anotaciones?
- Edición de css en una página de configuración para un programa basado en web en Android