2011-08-22 10 views
5

Tengo un método llamado hostPhoto(); Básicamente carga una imagen a un sitio y recupera un enlace. Luego tengo otro método para publicar el enlace a un sitio web.Android cómo esperar a que el código finalice antes de continuar

Ahora, la forma Im' usando este método es la siguiente:

String link = hostPhoto(); //returns a link in string format 

post(text+" "+link); // posts the text + a link. 

Mi problema es ... que el hostPhoto() toma unos segundos para cargar y recuperar el enlace, mi programa parece no espere y continúo publicando, por lo tanto, me quedé con el enlace como nulo,

¿De todos modos podría hacer que obtenga el enlace primero ... y luego publicarlo? como un tipo de OnComplete? o algo así ... pensé que mi método anterior funcionaría, pero al hacer Log.i parece que el enlace se devuelve a la cadena después de un segundo más o menos.

ACTUALIZACIÓN: Este es el progreso de las actualizaciones de mi problema, estoy utilizando una AsyncTask como se informó, pero el error de Log.i muestra el urlLink como nulo ... esto significa que el enlace solicitado desde hostphoto nunca regresó. para los registros ...

ACTUALIZACIÓN 2: FINALMENTE FUNCIONA! El problema era el hilo dentro de hostPhoto(), ¿podría alguien explicarme por qué ese hilo habría causado esto? Gracias a todos los que respondieron.

private class myAsyncTask extends AsyncTask<Void, Void, Void> { 
    String urlLink; 
    String text; 
    public myAsyncTask(String txt){ 

     text=txt; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     urlLink=hostPhoto(); 
     //Log.i("Linked", urlLink); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 

     try { 
      Log.i("Adding to status", urlLink); 
      mLin.updateStatus(text+" "+urlLink); 
      Log.i("Status:", urlLink); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

hostPhoto() hace lo siguiente:

  String link; new Thread(){ 

       @Override 
       public void run(){ 
        HostPhoto photo = new HostPhoto(); //create the host class 


        link= photo.post(filepath); // upload the photo and return the link 
        Log.i("link:",link); 
       } 
      }.start(); 
+0

Debe publicar más código, especialmente el contenido de 'hostPhoto()', ya que el comportamiento que está describiendo no es estándar. –

+0

Un 'AsyncTask' no resuelve este problema ya que' hostPhoto() 'ni siquiera bloquea el hilo. Como mencionó atc, necesitas publicar el código de 'hostPhoto()'. –

+0

el código de hostPhoto ha sido actualizado – asd2005

Respuesta

8

Puede utilizar AsyncTask aquí,

AsyncTask

mediante el uso de que se puede ejecutar el código de

hostPhoto()

en doInBackground() y luego ejecutar el código de

post(text+" "+link);

en el método onPostExecute(), esa será la mejor solución para usted.

Puede escribir el código en este patrón

private class MyAsyncTask extends AsyncTask<Void, Void, Void> 
{ 
    @Override 
    protected Void doInBackground(Void... params) { 
     hostPhoto(); 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Void result) { 
     post(text+" "+link); 
    } 
} 

y puede ejecutarlo utilizando

new MyAsyncTask().execute(); 
+0

Hola, gracias por tu respuesta. Después de realizar su método estoy obteniendo un error. ¡Compruebe la pregunta actualizada arriba – asd2005

+0

FINALMENTE FUNCIONA! El problema era el hilo dentro de hostPhoto(), ¿podría alguien explicarme por qué ese hilo habría causado esto? – asd2005

2

Estoy asumiendo que es (o debería ser) usando un hilo separado para llevar a cabo esta acción de forma asíncrona.

Debe colocar el post() en una devolución de llamada a la que se llama cuando se completa hostPhoto().

En general he hecho esto con AsyncTask con Android ...

Esto le proporciona la devolución de llamada onPostExecute() que puede hacer su post() interior.

0

puede utilizar AsyncTask, consulte this:

EDITAR: y él es un video de tutorial AsyncTask, o consulte este ejemplo muestra: clic here

0

Para su segunda pregunta:

alguien podría proporcionar una explicación de por qué ese hilo tendría causado esto?

Llama al "link = photo.post (filepath);" que se ejecuta en un nuevo hilo. Mientras que el método todavía está en marcha, enlace sigue siendo nula, y el hilo actual (hilo principal) continúa funcionando con ese enlace (nulo en ese momento)

En esta situación hay que esperar por el resultado, por lo deje que el nuevo subproceso ejecute el método, y después de completarlo, ese subproceso pedirá al hilo principal que actualice el resultado (mediante alguna devolución de llamada o controlador), todos esos trabajos están bien encapsulados por Android AsyncTask

Cuestiones relacionadas