2010-08-01 6 views
4

J'ai un problème assez intéressant lorsque j'essaie d'afficher un ProgressDialog (type simple, type spinner) dans un écouteur onPreferenceChange.Affichage de ProgressDialog dans une PreferenceActivity

public class SettingsActivity extends PreferenceActivity { 
    private ProgressDialog dialog; 

    public void onCreate(Bundle savedInstanceState) { 
    ListPreference pref= (ListPreference) findPreference("myPreference"); 
    pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 

     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
     dialog = ProgressDialog.show(SettingsActivity.this, "", "Doing stuff...", true); 
     SystemClock.sleep(2000); 
    } 
    return true; 
    } 
} 

Le ProgressDialog montre, mais pas tant que la méthode (sleep dans ce cas) est terminé. Qu'est-ce que je fais mal?

Répondre

3

Vous pouvez utiliser AsyncTask pour exécuter la fonction dans un thread séparé (voir http://developer.android.com/resources/articles/painless-threading.html)

Ceci est probablement un peu inutile si vous voulez juste invoquer une méthode sleep, mais devrait fonctionner même pour d'autres méthodes qui sinon bloqueraient le thread UI.

Vous pouvez faire quelque chose comme ceci:

private class BackgroundTask extends AsyncTask<Integer, Integer, void> { 
    private ProgressDialog dialog; 

    @Override 
    protected void onPreExecute() { 
     dialog = ProgressDialog.show(SettingsActivity.this, "", "Doing stuff...", true); 
    } 

    @Override 
    protected void doInBackground(Integer... params) { 
     sleep(params[0]); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     dialog.dismiss(); 
    } 
} 

Et que l'appeler en utilisant le code ci-dessous:

new BackgroundTask().execute(2000); 
4

Vous dormez sur le thread d'interface utilisateur principal, ce qui empêche le système d'exploitation de gérer les événements de votre application. Cela empêchera votre application de se redessiner et, comme vous l'avez découvert, peut empêcher l'apparition de nouvelles fenêtres.

au lieu de dormir, essayez ceci:

final ProgressDialog dialog = ProgressDialog.show(
    SettingsActivity.this, "", "Doing stuff...", true); 
new Handler().postDelayed(new Runnable() { 
    public void run() { 
     dialog.hide(); 
    } 
    }, 2000); 
+0

Merci de me dire quel était le problème, puisque je plutôt pensé qu'il avait quelque chose faire avec le PreferenceActivity (puisque ce problème pour une raison quelconque ne s'est pas produit dans aucune autre de mes activités). Cependant, étant donné que je souhaiterais pouvoir appeler d'autres méthodes que sleep() à l'avenir, ce ne serait pas une très bonne solution (même si cela aurait probablement été la meilleure solution dans le cas contraire). – nip3o

Questions connexes