Java 在PreferenceActivity中显示ProgressDialog
当我试图在Java 在PreferenceActivity中显示ProgressDialog,java,android,progressdialog,preferenceactivity,Java,Android,Progressdialog,Preferenceactivity,当我试图在onPreferenceChange侦听器中显示ProgressDialog(简单的微调器类型)时,我遇到了一个非常有趣的问题 public class SettingsActivity extends PreferenceActivity { private ProgressDialog dialog; public void onCreate(Bundle savedInstanceState) { ListPreference pref= (ListPrefer
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
)完成。我做错了什么?您睡在主UI线程上,这会阻止操作系统处理应用程序的事件。这将阻止你的应用程序重新绘制,正如你所发现的,可以阻止新窗口实际出现
不要睡觉,试试以下方法:
final ProgressDialog dialog = ProgressDialog.show(
SettingsActivity.this, "", "Doing stuff...", true);
new Handler().postDelayed(new Runnable() {
public void run() {
dialog.hide();
}
}, 2000);
您可以使用
AsyncTask
在单独的线程中运行函数(请参阅)
如果您只想调用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();
}
}
谢谢你告诉我问题是什么,因为我认为这与PreferenceActivity有关(因为我的任何其他活动中都没有出现过这个问题)。但是,因为我希望将来能够调用sleep()以外的其他方法,所以这不是一个很好的解决方案(即使如果不是这样,它可能是最好的解决方案)。
new BackgroundTask().execute(2000);