2010-08-01 72 views
4

當我嘗試在onPreferenceChange偵聽器中顯示ProgressDialog(簡單,微調器類型)時,我有一個相當有趣的問題。在PreferenceActivity中顯示ProgressDialog

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; 
    } 
} 

ProgressDialog顯示出來,但直到該方法(sleep在這種情況下)已經完成。我究竟做錯了什麼?

回答

3

您可以使用AsyncTask運行在一個單獨的線程的功能(參見http://developer.android.com/resources/articles/painless-threading.html

這可能是有點不必要的,如果你只是想調用一個sleep方法,但應該工作,即使其他方法,否則會阻止UI線程。

你可以做這樣的事情:

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(); 
    } 
} 

而不是把它用下面的代碼:

new BackgroundTask().execute(2000); 
4

您正在主UI線程中休眠,這會阻止操作系統處理應用程序的事件。這將阻止您的應用程序重新繪製,並且如您所發現的,可以防止實際顯示新窗口。

而是睡覺的,試試這個:

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

謝謝你告訴我的問題是什麼,因爲我原以爲這有什麼與PreferenceActivity有關(因爲這個問題出於某種原因在我的任何其他活動中都沒有發生過)。但是,由於我希望將來能夠調用除sleep()之外的其他方法,因此它不是一個很好的解決方案(即使它可能是最好的解決方案)。 – nip3o 2010-08-01 12:48:13