2010-11-17 22 views
5

Esta es mi primera publicación de stackflow, así que sea amable conmigo. Estoy seguro de que lo que estoy tratando de hacer es posible y es algo que he hecho (o no he hecho?) Que está causando el problema ... No estoy seguro de qué es ese algo es.Android ProgressDialog no gira

lo que estoy tratando de hacer:
muestran una ProgressDialog mientras mis Sincroniza aplicaciones y procesa los datos descargados.

El problema:
Los espectáculos ProgressDialog pero no gira (que hace que parezca que se ha congelado), la sincronización y el procesamiento ocurre, el ProgressDialog cierra, la aplicación continúa de forma normal.

Cómo Actualmente estoy Tring para hacer eso:
Crear una ProgressDialog - en mi actividad
hacer la sincronización - en mi servicio
procesar los datos - en mi servicio
Dismis la ProgressDialog - en mi actividad

Las cosas que he intentado:
el uso de un hilo (código de abajo) el uso de un AsynTask (puede proporcionar el código si es necesario) Usando un controlador (puede proporcionar el código si es necesario)

Después de pasar mucho tiempo buscando la respuesta a mi pregunta, parece que otros han tenido el mismo problema o similar y han logrado resolverlo usando una de las ideas anteriores. Sin embargo, no he podido implementar ninguna de estas ideas para resolver mi problema en particular. Esto me asegura que es algo que estoy haciendo mal ... No estoy seguro de qué.

El código original que escribió y estoy usando como base para todos mis intentos de correcciones:
Primera

public class myActivity extends ListActivity { 
    private ProgressDialog dialog; 
    private boolean mIsBound; 
    private myService mBoundService; 
    private ServiceConnection mConnection; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     /*if we need to login start login activity for result*/ 
     ... 
    } 

    ... 
    /*other methods*/ 
    ... 
} 

continuación

protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    switch (requestCode){ 
     case ACTIVITY_LOGIN: 
      /*after login we know we always need to sync*/ 
     dialog = new ProgressDialog(myActivity.this); 
     dialog.setMessage("Synchronising..."); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 

      Thread doBind = new Thread(new Runnable(){public void run(){doBindService();}}); 
      doBind.start(); 
      break; 
    } 
} 

por lo que ahora estoy asumiendo que doBind está sucediendo en un hilo diferente, dejando el hilo de la interfaz de usuario sin nada que hacer aparte de mostrar el diálogo progresivo ...?

private boolean doBindService() { 
mConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder service) { 
      mBoundService = ((myService.LocalBinder)service).getService();  
      while (mBoundService.isRunning()){ 
       /*wait for service to finish before doing anything else... myMethod() is expecting the sync to have completed*/ 
       /*I suspect this loop to be the thing causing the problem. But I'm not sure why because it is in a different thread so shouldn't interfear with the dialog?! And if that is what is causing the problem then how else can I do this?*/ 
      } 
      /*get the activity to do Stuff with the downloaded data*/ 
      myMethod(); 
      /*finished with the service for now so unbind*/ 
      doUnbindService(); 
      if (dialog != null) { 
       dialog.dismiss(); 
      } 
     } 

     public void onServiceDisconnected(ComponentName className) { 
      mBoundService = null; 
     } 
    }; 

    boolean myReturn = bindService(new Intent(myActivity.this, myService.class), mConnection, Context.BIND_AUTO_CREATE); 
    mIsBound = myReturn; 
return myReturn; 
} 

private void doUnbindService() { 
    if (mIsBound) { 
     unbindService(mConnection); 
     mIsBound = false; 
    } 
} 

Háganme saber si necesita más información para ayudarme con este problema.


EDIT:

Aquí está el código que estoy utilizando para utilizar un controlador en su lugar. Esto muestra el mismo comportamiento (el girador no gira) como antes.

Thread doBind = new Thread(new Runnable(){ 
    public void run(){ 
     doBindService(); 
    } 
}); 
doBind.start(); 

.

private Handler handler = new Handler() { 
    @Override 
public void handleMessage(Message msg) { 
    dialog.dismiss(); 
} 
}; 

.

private boolean doBindService() { 
mConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder service) { 
      mBoundService = ((myService.LocalBinder)service).getService();  
      while (mBoundService.isRunning()){ 
      } 
      //...do stuff same as before... 
      handler.sendEmptyMessage(0); 
     } 

     public void onServiceDisconnected(ComponentName className) { 
      mBoundService = null; 
     } 
    }; 

    boolean myReturn = bindService(new Intent(myActivity.this, myService.class), mConnection, Context.BIND_AUTO_CREATE); 
    mIsBound = myReturn; 
return myReturn; 
} 
+0

Veo este mismo comportamiento de congelación en mi diálogo de progreso. Por lo general, es cuando la tarea está casi terminada y el diálogo está por cerrarse. ¿Por cuánto tiempo está tu diálogo? Si haces que el hilo duerma durante unos segundos, ¿eso hace que el diálogo gire? – softarn

+0

Tengo un problema similar con ProgressDialog al que pregunté aquí: http://stackoverflow.com/questions/3821306/progressdialog-created-from-oncreatedialog-stops-animating-on-second-run. Creo que hay un error en la base de código de Android. – ageektrapped

+0

@softarn: Gracias por la sugerencia. Si hago: Tema doBind = new Thread (nueva Ejecutable() { \t public void run() {try { \t \t \t \t Thread.sleep (10000); \t \t} catch (InterruptedException e) { \t \t \t e.printStackTrace(); \t \t} doBindService(); \t} }); El cuadro de diálogo gira durante 10 segundos y luego se congela durante 3 a 4 segundos antes de desaparecer ... – John

Respuesta

2

El problema con el control de giro está relacionado con el ServiceConnection que creará en el nuevo hilo. desafortunadamente para ti, esto se ejecutará en tu subproceso principal/gui.

A partir de la referencia de la API: (http://developer.android.com/reference/android/content/ServiceConnection.html)

Al igual que muchas devoluciones de llamadas del sistema, los métodos de esta clase son llamado desde el hilo principal de su proceso.

lo tanto, ya no estoy familiarizado con los servicios solo puedo suponer que una forma de comunicación cuando el servicio se lleva a cabo la descarga de datos sería la de transmitir una intención que se oyen en su actividad, y luego detener la ProgressDialog. Pero ciertamente también hay otras formas.

Y como nota al margen, nunca debe modificar la interfaz gráfica de usuario de ningún hilo que no sea el hilo principal, lo que está tratando de hacer al generar un nuevo hilo que intenta descartar el diálogo. Solo debe descartar el diálogo del hilo principal.

+0

Estoy investigando su sugerencia (enviando y reaccionando a un intento) y en este momento parece que esta es la respuesta a mi problema. Howerver dices en tu publicación "ciertamente también hay otras formas". ... ¿Cuáles son estas otras formas? ¿Alguna de estas sería una "mejor" forma de hacer esto? – John

+0

Usando su sugerencia, encontré esta publicación: http://stackoverflow.com/questions/2843874/in-android-how-to-call-function-of-activity-from-a-service y ahora tengo una aplicación en funcionamiento. ¡Gracias por tu ayuda! – John

0

Hay ¿Puedes tratar de utilizar Handler?

Creo que deberías hacer esto mediante el uso de la función de controlador de Android

+0

Hola. Gracias por tu sugerencia. He intentado implementar un controlador para hacer esto, pero no tengo claro dónde debería estar la llamada y qué debería hacer realmente. Mi implementación actual aún muestra el mismo problema que se describe al usar un hilo. Usé el ejemplo como se ve en http://www.helloandroid.com/tutorials/using-threads-and-progressdialog. Editaré mi publicación original y agregaré el código que probé. Si pudieras echar un vistazo y ver lo que estoy haciendo mal, lo agradeceré. – John

0
public class yourclass extends Activity implements Runnable { 

    static ProgressDialog progressDialog; 

    @Override 
    public void onCreate(Bundle icicle) { 
       progressDialog = ProgressDialog.show(keywordview.this, "", "Loading...", true); 
       Thread thread = new Thread(keywordview.this); 

    } 
    final Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      progressDialog.dismiss(); 
     /*Here you can handle you process*/ 
     } 
    }; 

    public void run() { 
     //here your code for run 
     handler.sendEmptyMessage(0); 
    } 
} 
Cuestiones relacionadas