我有一個應用程序,它有很多偏好。所以當用戶首次加載首選項時,需要相當長的一段時間。因此,在加載首選項時UI會凍結。Android將AsyncTask添加到PreferenceActivity以首次加載許多首選項
這就是爲什麼我要添加一個對話框,告訴用戶加載了前導。
的問題是,在加載喜好只允許在UI線程上,因爲當我試圖加載在異步任務我的喜好,我得到這個:
ERROR/AndroidRuntime(4830):造成: android.view.ViewRoot $ CalledFromWrongThreadException:只有創建視圖層次結構的 原始線程可以觸及其視圖。
所以,當我在的AsyncTask添加runOnUiThread()的異步任務做它的全部目的被破壞:
public class ApplicationPreferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new ProgressTask(ApplicationPreferences.this).execute();
}
private class ProgressTask extends AsyncTask<Void, Void, Void> {
private Context context;
private ProgressDialog dialog;
public ProgressTask(ListActivity activity) {
context = activity;
dialog = new ProgressDialog(context);
}
protected void onPreExecute() {
this.dialog.setMessage("Loading...");
this.dialog.show();
}
@Override
protected Void doInBackground(Void... params) {
runOnUiThread(new Runnable() {
@Override
public void run() {
initPreferences();
}
});
return null;
}
@Override
protected void onPostExecute(Void result) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
}
/*
* THIS TAKES LONG THE FIRST TIME
*/
private void initPreferences() {
addPreferencesFromResource(R.xml.preferences);
// preferences
ListPreference pref1 = (ListPreference) findPreference(getString(R.string.pref1));
// ........ etc
}
public static void start(Context context) {
context.startActivity(new Intent(context, ApplicationPreferences.class));
} }
我怎樣才能做得更好?
不,它預計等待。但到目前爲止,只有在整個任務完成之前,對話纔會出現。因此,它的菜單 - >設置,然後凍結,然後對話,然後很快顯示前綴 – IHeartAndroid