2010-08-01 467 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