2012-07-20 20 views
6

Tengo problemas para reiniciar AsyncTask después de intentar volver a abrir la actividad.Android reiniciar AsyncTask

Cuando abro la actividad la llamo para iniciar el AsyncTask que funciona la primera vez.

myTask connectedTask; 
connectedTask = new myTask(); 
connectedTask.execute(); 

public class myTask extends AsyncTask<Integer,Integer, Integer> { 

    @Override 
    protected Integer doInBackground(Integer... arg0) { 
     //Increase timer and wait here in a loop 
     System.out.println("ASYNC TASK STARTING!"); 
     return IsSocketConnected(); 
    } 

    protected void onPostExecute(Integer result) { 
     //Something you want to do when done? 
     System.out.println("ASYNC TASK DONE!"); 

     // if it was connected successfully 
     if(result == 1) { 
      // remove the progress bar 
      proBar.setVisibility(View.GONE); 

      // Discover available devices settings and create buttons 
      CreateButtons(btnList); 
     } 
    } 
} 

IsSocketConnected(); // checks for a bluetooth connections to be done. 

Cuando vuelva a la actividad anterior y tratar de empezar de nuevo que la actividad no puedo conseguir el AsyncTask que empezar de nuevo.

He leído que siempre que creara una nueva instancia del AsyncTask debería reiniciar esas tareas.

¿Hay algo más que deba hacer?

Gracias,

+1

¿Qué quiere decir que no puede hacer que funcione? ¿Recibes un mensaje de error? –

+0

Lo siento Ted, esa fue una mala elección de palabras. Quise decir que no puedo hacer que se reinicie. No obtengo ningún código de error. No va a doInBackground – jramirez

+0

¿Este código está en 'onCreate'? 'onResume'? De acuerdo con @TedHopp, se necesita más información. – Greyson

Respuesta

2

Gracias por todos sus comentarios que ayudaron mucho. Decidí eliminar el AsyncTask. Terminé usando un subproceso ejecutable normal y el uso de controladores para volver a enviar los mensajes al hilo de la interfaz de usuario. Aquí está el código:

 // Start thread here only for IsSocketConnected 
     new Thread(new Runnable() { 

      public void run() { 

       //Add your code here.. 
       IsSocketConnected(); 

      } 
     }).start(); 


// handler that deals with updating UI 
public Handler myUIHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     if (msg.what == Bluetooth.STATE_CONNECTED) 
     { 
      //Update UI here... 
      Log.d(TAG, "Connected"); 




      // Discover available devices settings and create buttons 
      CreateButtons(btnList); 

     } else if(msg.what == Bluetooth.STATE_NONE) { 

      Log.d(TAG, "NOT Connected"); 
     } 

}

// in the IsSocketConnected() I call this 
Message theMessage = myUIHandler.obtainMessage(Bluetooth.STATE_CONNECTED); 
myUIHandler.sendMessage(theMessage);//Sends the message to the UI handler. 

Esto está trabajando hasta ahora. Gracias de nuevo. Espero que esto ayude a alguien

+1

El beneficio de 'AsyncTask' es que ejecuta tareas en un grupo de subprocesos. Es más eficiente que crear un nuevo hilo cada vez. Por supuesto, siempre puedes ejecutar esto en tu propio grupo de subprocesos. – dhaag23

2

Eso es correcto, puede simplemente crear una nueva instancia y ejecutarlo para empezar de nuevo. Me pregunto en qué función está comenzando la tarea. Probablemente sea una buena idea iniciarlo en la función onResume(), solo en caso de que la actividad no se destruya antes de volver al primer plano.

0

trate de poner este código en onResume() como:

@Override 
public void onResume() 
{ 
    super.onResume(); 
    myTask connectedTask = new myTask(); 
    connectedTask.execute(); 
} 

Se debe crear un nuevo objeto al reanudar de nuevo a su Activity. No lo publicó, pero probablemente creó el objeto en onCreate() que solo se ejecuta una vez.

Mi recomendación para el manejo de las conexiones Socket es solo la subclase Thread.

+0

Cuidado ... necesita agregar la anotación @Override a su función allí. Además, solo para aclarar, se llama a onCreate() cada vez que se crea la actividad. Lo mismo ocurre con OnResume, la diferencia es que la actividad tiene que morir antes de que onCreate pueda ser llamado nuevamente. Esta es esencialmente la misma respuesta que publiqué hace 20 minutos ... – Joel

+0

Dependiendo de lo que esté haciendo la tarea asincrónica, esta podría ser una estrategia muy pobre. 'onResume' se invoca cuando la actividad se reanuda desde pausa, lo que puede suceder muchas veces mientras la actividad está activa. (Por ejemplo, retirar una notificación, recibir una llamada, etc.) –

+0

Buena captura con la anulación. Se llama a onCreate() cada vez que se crea la actividad, pero parece que tiene un problema para volver a activar la actividad, lo que simplemente llama a onResume(). También recomendé que simplemente use un hilo para su conexión. –

2

Probablemente puede ayudar a alguien que se encontrará con esto en el futuro. Usted puede añadir un método:

public class MainActivity extends Activity { 

    public static MyTask loadTextDataTask; 

    //... methods 

    public class MyTask extends AsyncTask<Void, Void, Void> { 

     //... methods 

     public void selfRestart() { 
      loadTextDataTask = new MyTask(); 
     } 
    } 

}

Entonces se puede usar de cualquier otra clase como:

MainActivity.loadTextDataTask.selfrestart(); 
0

mejor, use OnPostExecute, para desencadenar una nueva instancia de la tarea . Se disparará si la tarea se completa. Pero el uso de un valor lógico para evitar que en sí para desencadenar cada

protected void onPostExecute(Void result) { 

if(someboolean==true) { 
          new instance of task; 
          instance.execute; 
       someboolean=false; 
       } 

} 
0

El sitio web de desarrollador dice

Cuando se introdujo por primera vez, AsyncTasks fueron ejecutados en serie en un solo subproceso en segundo plano.Comenzando con DONUT, esto se cambió a un conjunto de subprocesos que permite que varias tareas funcionen en paralelo. Comenzando con HONEYCOMB, las tareas se ejecutan en un único hilo para evitar errores de aplicación comunes causados ​​por la ejecución paralela.

Si realmente desea la ejecución en paralelo, puede invocar executeOnExecutor (java.util.concurrent.Executor, Object []) con THREAD_POOL_EXECUTOR.

Comenzando con HONEYCOMB, AsyncTask usa un único ejecutor por defecto para ejecutar tareas, que luego ejecuta una tarea a la vez. Significa que si llama a myTask.execute() después de haberlo llamado en cualquier actividad (en cualquier parte del hilo principal), la segunda llamada esperará para invocar el método doInBackground hasta que se complete la primera tarea. Si su método IsSocketConnected() no se devuelve inmediatamente, bloqueará las invocaciones de doInBackground() después de llamar al método AsyncTask.execute() nuevamente en cualquier lugar del hilo principal, hasta que la Tarea actual finalice.

Si su isSocketConnected() utiliza cualquier operación de bloqueo tal como se espera() o Thread.sleep(), puede trabajar alrededor de ella llamando myTask.cancel (verdadero) en el OnDestroy() llamada de retorno a su actividad, que lanzará una InterruptedException. Solo asegúrate de atrapar la InterruptedException en un lugar que haga que el hilo salga del método doInBackground.

También puede hacer una solución usando un ThreadPoolExecutor personalizado y llamando al método AsyncTask.executeOnExecutor (Executor).

0

En lugar de utilizar: connectedTask = new myTask(); connectedTask.execute();

Simplemente use: newconnectTask.execute(); ¡Úselo donde quiera exactamente reiniciar la tarea!

Cuestiones relacionadas