2010-12-01 37 views
2

Je rencontre de sérieux problèmes lors de l'affichage d'un ProgressDialog pendant qu'un service est en cours de préparation ... Le service prend du temps pour se préparer car il est un peu lourd, donc je veux afficher ProgressDialog Pendant ce temps, il a commencé.Affichage de ProgressDialog pendant le démarrage d'un service

La chose est que cela montre bien la ProgressDialog avant la prochaine activité commence ... Je ne trouve pas ce qu'elle est ...

package org.pfc; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.BroadcastReceiver; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 


public class ConnectActivity extends Activity { 

    // FIELDS------------------------------------------------------------------ 

    protected LocalService mSmeppService; 
    private ProgressDialog progressDialog; 

    private Thread tt; 

    private ServiceConnection mConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder service) { 
      // Gets the object to interact with the service 
      mSmeppService = ((LocalService.LocalBinder) service).getService(); 
     } 

     public void onServiceDisconnected(ComponentName className) { 
      // This is called when the connection with the service has been 
      // unexpectedly disconnected -- that is, its process crashed. 
      // Because it is running in our same process, we should never 
      // see this happen. 
      mSmeppService = null; 
     } 
    }; 

    // For getting confirmation from the service 
    private BroadcastReceiver serviceReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.i(TAG, "receiver onReceive..."); 

      if (progressDialog.isShowing()) 
       progressDialog.dismiss(); 

      // Change activity 
      Intent groupsActivityIntent = new Intent(ConnectActivity.this, 
        GroupsActivity.class); 
      startActivity(groupsActivityIntent); 
     } 
    }; 

    // METHODS ---------------------------------------------------------------- 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (LocalService.isRunning) { 
      // TODO start ListActivity 
      Log.i(TAG, "Starting GroupsScreen"); 

      Intent i = new Intent(ConnectActivity.this, GroupsActivity.class); 
      startActivity(i); 
     } else { 

      setContentView(R.layout.connect_screen); 

      // Add listener to the button 
      Button buttonConnect = (Button) findViewById(R.id.button_connect); 
      buttonConnect.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        processThread(); 
       } 
      }); 
     } 
    } 


    // PRIVATE METHODS -------------------------------------------------------- 

    private void processThread() { 

     progressDialog = ProgressDialog.show(ConnectActivity.this, "", 
       "Loading. Please wait...", true, false); 

     tt = new Thread() { 
      public void run() { 

       // Register broadcastReceiver to know when the service finished 
       // its creation 
       ConnectActivity.this.registerReceiver(serviceReceiver, 
         new IntentFilter(Intent.ACTION_VIEW)); 

       // Starts the service 
       startService(new Intent(ConnectActivity.this, 
         LocalService.class)); 

       Log.i(TAG, "Receiver registered..."); 
      } 
     }; 
     tt.start(); 
    } 
} 

Le service exécute à la fin de la méthode onStart ceci:

// Send broadcast so activities take it 
Intent i = new Intent(Intent.ACTION_VIEW); 
    sendOrderedBroadcast(i, null); 

Ainsi, les pistes de méthode OnReceive et nous allons à la prochaine activité

Répondre

3

le problème est que vous n'êtes pas en cours d'exécution ProgressDialog dans un thread d'interface utilisateur.

Ajoutez un gestionnaire qui gérera les messages dans votre thread d'interface utilisateur.

private static final int UPDATE_STARTED = 0; 
private static final int UPDATE_FINISHED = 1; 

private Handler handler = new Handler(){ 
    @Override public void handleMessage(Message msg) { 
    switch (msg.what) { 
    case UPDATE_STARTED: 
     progressDialog = ProgressDialog.show(ConnectActivity.this, "", 
      "Loading. Please wait...", true, false);     
    break; 
    case UPDATE_FINISHED: 
     if(progressDialog.isShowing()){ 
     progressDialog.dismiss();  
     }    
    break; 
    } 
    } 
}; 


private void processThread() { 
    Message m = new Message(); 
    m.what = UPDATE_STARTED; 
    handler.sendMessage(m); 

    //Your working code 

    m = new Message(); 
    m.what = UPDATE_FINISHED; 
    handler.sendMessage(m); 
} 

bonne chance!

+0

Merci de votre demande. J'ai essayé mais ça n'a pas marché. J'ai découvert le problème à la fin. Le truc, c'est que je faisais beaucoup de travail avec la méthode onStart (dans le Service), de sorte que le travail bloquait d'une certaine manière certains auditeurs du système et que ni BroadCastReceivers ni Handlers ne se réveillaient. Une fois que j'ai migré le code onStart vers un thread parallèle, cela a fonctionné comme un champion, à la fois avec BroadcastReceivers et Handlers: D – Pedriyoo