Android cómo esperar a que termine el código antes de continuar
Tengo un método llamado hostPhoto()
; Básicamente sube una imagen a un sitio y recupera un enlace. Entonces tengo otro método para publicar el enlace a un sitio web.
Ahora la manera Im que usa este método es como esto:
- Necesita ayuda para cambiar de actividad
- Prueba de la unidad de Android Studio SQLiteDataBase es nula
- Android: Inicie una actividad inmediatamente y luego cargue el contenido
- Mejora el adaptador grande ListView deslizamiento suave, a veces espasmódico
- No se puede iniciar Android Studio
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 esperar y seguir publicando, por lo tanto, me quedo con el enlace como nulo,
¿Hay de todos modos podría hacerlo conseguir el acoplamiento primero … y después fijar? Como una especie 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 o algo así.
UPDATE: Este es el progreso de las actualizaciones en mi problema, estoy usando un AsyncTask como informado, pero el error de Log.i mostrando el urlLink como un nulo … esto significa que el enlace solicitado de hostphoto nunca regresó intime para los Logs. .
ACTUALIZACIÓN 2: ¡FINALMENTE TRABAJA! El problema fue el hilo dentro de la hostPhoto (), ¿alguien podría proporcionarme un explination 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 esto:
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();
- Google Cloud Messaging: Valor de carga útil siempre cadena
- ¿Existe una API disponible para usar la función de control remoto de red de Samsung TV?
- Problema con Proguard de Android: sigue recibiendo error "java.io.IOException: No se puede procesar la clase ..." cuando se oculta la obfuscación
- La exportación de Eclipse firmada APK falla con SDK 12 y LÍMITE DE COMPATIBILIDAD
- Pruebe una referencia débil antes de usar java
- Detección de lanzamientos de actividades de Android
- ¿Hay alguna práctica recomendada para empaquetar capas MVP?
- ¿Cómo implementar correctamente un listview personalizado con imágenes usando la biblioteca de Picasso?
Puede utilizar AsyncTask aquí,
AsyncTask
Usando eso puedes ejecutar el código de
hostPhoto()
En doInBackground () y luego ejecutar el código de
post(text+" "+link);
En el método onPostExecute (), que 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 usando
new MyAsyncTask().execute();
Estoy asumiendo que usted es (o debe ser) usando un hilo de rosca separado asincrónicamente para lograr esta acción.
hostPhoto()
colocar la post()
en una devolución de llamada que se llama cuando hostPhoto()
esté completa.
Generalmente he hecho esto con AsyncTask con Android …
Esto le proporciona la devolución de llamada onPostExecute()
que puede hacer su post()
dentro.
Puede utilizar AsyncTask
, consulte esto :
EDIT : y él es un tutorial de vídeo de asynctask, o remítase a este ejemplo de ejemplo: clic aquí
Es probable que tenga que echar un vistazo al patrón de devolución de llamada en Java .
A su segunda pregunta:
¿Alguien podría proporcionarme una explicación de por qué ese hilo hubiera causado esto?
Usted llama "link = photo.post (filepath);" Que se está ejecutando en un nuevo hilo. Mientras ese método sigue funcionando, el vínculo sigue siendo nulo y el hilo actual (hilo principal) continúa ejecutándose con ese enlace (nulo en ese momento)
En esta situación, debe esperar el resultado, así que deje que el nuevo Thread ejecute el método y después de completarlo, el hilo preguntará al subproceso principal para actualizar el resultado (por algún Callback o Handler), todos los trabajos están bien encapsulados por Android AsyncTask
- Android, programación orientada a objetos vs diseñar para el funcionamiento
- No se puede subir apk a Crashlytics