【问题标题】:Displaying ProgressDialog within a PreferenceActivity在 PreferenceActivity 中显示 ProgressDialog
【发布时间】:2010-08-01 00:43:06
【问题描述】:

当我尝试在 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)完成。我做错了什么?

【问题讨论】:

    标签: java android progressdialog preferenceactivity


    【解决方案1】:

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

    不要睡觉,试试这个:

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

    【讨论】:

    • 感谢您告诉我问题出在哪里,因为我宁愿认为它与 PreferenceActivity 有关(因为由于某种原因,这个问题在我的任何其他活动中都没有发生)。但是,由于我希望将来能够调用 sleep() 以外的其他方法,因此这不是一个很好的解决方案(即使否则它可能是最好的解决方案)。
    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-11
      • 2014-09-09
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      相关资源
      最近更新 更多