私は非常に多くの設定を持つアプリケーションを持っています。ユーザーが初めてPreferencesを読み込むと、かなりの時間がかかります。したがって、UIはフリーズしている間にフリーズしています。Android初めての設定をたくさん読み込むために、AsynchronousTaskをPreferenceActivityに追加してください。
これは、ユーザーにプレフィックスがロードされていることを伝えるダイアログを追加する理由です。
ERROR/AndroidRuntime(4830):
問題は、私は非同期タスクで私の好みをロードしようとしていたとき、私はこれを取得するので好みをロードするだけでUIスレッド上で許可されていること、です原因: android.view.ViewRoot $ CalledFromWrongThreadException:ビュー階層を作成した 元のスレッドのみがビューに触れることができます。私は非同期タスクにrunOnUiThreadを()を追加するとき
だからAsyncTaskでそれをやっての全体の目的は、破壊されます:
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));
} }
は、どのように私はこれよりよく行うことができますか?私は非同期タスクにrunOnUiThreadを()を追加するとき
いいえ、待つ必要はありません。しかし、これまでのところ、ダイアログは、タスク全体が終了する直前まで表示されません。そのメニュー - >設定し、フリーズしてからダイアログを開き、そのあとすぐにプリファレンスが表示されます – IHeartAndroid