2

私は非常に多くの設定を持つアプリケーションを持っています。ユーザーが初めて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を()を追加するとき

答えて

0

私は、私は考えることができる最高の解決策を考え出した:

あなたは非常に大きな設定ファイルを持っている場合は、UIスレッド上でいくつかの点で

PreferenceManager.setDefaultValues(context, R.xml.mypreferencefile, false); 

を呼び出す必要があります。

私はこれを、アプリケーションの初期化段階の最後に行います。そのようにして、ユーザーはアプリの短時間の凍結について最も混乱していません。

このコマンドは、デフォルト値で初めてファイルを初期化します。その後、ファイルは利用可能であり、かなり迅速にアクセスすることができます。

0

だから の全体の目的は、AsyncTaskでそれをやって破壊します。

私はそれを理解していませんが、ユーザーに進行状況ダイアログを表示したい場合は、タスクが完了するのを待つことは期待できませんか?

一方、実際のバックグラウンドタスクでプリファレンスをロードする場合は、通常のJavaスレッドを使用します。非UIスレッドはAsyncTasksを作成できません。

編集:あなたは、おそらく追加のコメントの後、これは(ApplicationPreferences#のonCreateであなたのコードの一部を変更する)お手伝いを致します。

ProgressTask pTask = new ProgressTask(ApplicationPreferences.this); 
pTask.execute(); 
// Wait for the async task to finish the specified amount of time. 
pTask.get(10, TimeUnit.SECONDS); // Choose appropriate timeframe 

メインスレッドが奇妙な行動を停止し、うまくいけばなり道ます処理される。
もう一度:あなたの問題をまだ解決できない場合は、お気軽にコメントしてください。

+0

いいえ、待つ必要はありません。しかし、これまでのところ、ダイアログは、タスク全体が終了する直前まで表示されません。そのメニュー - >設定し、フリーズしてからダイアログを開き、そのあとすぐにプリファレンスが表示されます – IHeartAndroid

関連する問題