当我尝试在ProgressDialog
监听器中显示onPreferenceChange
(简单,微调器类型)时,我遇到了一个非常有趣的问题。
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
)完成。我做错了什么?
答案 0 :(得分:4)
您正在主UI线程上休眠,这会阻止操作系统处理您的应用程序事件。这将阻止您的应用重绘,正如您所发现的那样,可以防止实际出现新窗口。
不要睡觉,试试这个:
final ProgressDialog dialog = ProgressDialog.show(
SettingsActivity.this, "", "Doing stuff...", true);
new Handler().postDelayed(new Runnable() {
public void run() {
dialog.hide();
}
}, 2000);
答案 1 :(得分: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);