2012-02-23 6 views
0

私は数を表示するアクティビティを持っています。数がSharedPreferences例えばアクティビティで更新された値を待つ方法

int num=pref.getInt(myAsyncTask.MYNUMBER,0); 

から得られるSharedPreferenceは計算が(dbなどからデータを取得伴う)場所を取るAsyncTaskの内側にロードされます。したがって、アクティビティIのOnCreate()は、Asynctaskを実行して値を計算します。ただし、アクティビティを起動すると、必ずしも最新の値に更新されるわけではありません。これは、Asynctaskがアクティビティ内に値を表示する動作よりも新しい値を計算するのに時間がかかるためです。 Asynctaskが新しいプロセスで終了するまで、値を表示するメソッドの実行をどのように遅らせることができますか?

[編集] sharedpreferencesを削除しました。私はonPostExecute()メソッドを使用して結果を取得します。しかし、その動作は似ています。値が表示された後に結果が返され、何も表示されませんでした。

答えて

0

計算が数秒以上かかるしない場合は、最も簡単な解決策はAsyncTask.get()を使用することであるが、この方法は、UIスレッドの実行をブロックし、AsyncTaskが終了するのを待って、UIスレッドを行いますが:

public void onCreate(Bundle savedInstanceState) { 
    ... ... 
    MyAsyncTask myAsyncTask = nee MyAsyncTask(); 
    myAsyncTask.execute(); 
    myAsyncTask.get(); // alternatively you can use AsyncTask.(long timeout, TimeUnit unit) 
    ... ... 
} 

ベアであなたが計算を5秒より長くすると、UIスラムの実行がブロックされることを覚えておいてください。おそらくANR例外が発生します。

すでにAsyncTaskを使用しているので、値を表示するメソッドの実行をAsyncTask.onPostExecute()に移動する方が合理的な解決策です。これがシナリオの場合にこの種の問題を解決するAsyncTaskが存在する理由です。

+0

5秒以内です。 – JustCurious

+1

@ JustCurious、私はまだほとんどの場合に十分ですonPostExecute()にビューの更新コードを移動することをお勧めします。 – yorkw

+0

良い答え..しかし、それは動作しません...私はまだ値を取得しないでください。それは1秒間フリーズします。私はおそらくそれが役に立った – JustCurious

0

ちょうどlistenerのコンセプトを使用するか、アクティビティをasynctaskに渡してメインスレッドを呼び出すことができます。

+0

あなたのアクティビティ/ AsyncTaskがしっかりと結合されないように、リスナーを使用する方が良いでしょう –

0

アクティビティを起動したときに値が正しいと表示されない場合は、View.GONEに対する表示の可視性を設定して表示されないようにして、結果が表示されたときに表示に戻します。値を更新するには、AsyncTaskによって呼び出されるアクティビティにリスナーを実装できます。

時間がかかる(数秒以上かかる)場合は、ユーザーが待機する必要があることをユーザーが理解できるように、進行状況ダイアログも使用することをお勧めします。

+0

私は進行状況バーを使用します。時間は数秒を超えていません。問題は、最初にアクティビティが開始されたときに値が表示され、asynctaskが終了するのを何とか待ってほしいということです。 – JustCurious

関連する問題