有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在PreferenceActivity中显示ProgressDialog

当我试图在onPreferenceChange侦听器中显示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在本例中)完成。我做错了什么


共 (2) 个答案

  1. # 1 楼答案

    您正在主UI线程上睡觉,这会阻止操作系统处理应用程序的事件。这将阻止你的应用程序重新绘制,正如你所发现的,可以阻止新窗口实际出现

    不要睡觉,试试以下方法:

    final ProgressDialog dialog = ProgressDialog.show(
        SettingsActivity.this, "", "Doing stuff...", true);
    new Handler().postDelayed(new Runnable() {
        public void run() {
          dialog.hide();
        }
      }, 2000);
    
  2. # 2 楼答案

    您可以使用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);