2012-05-13 11 views
9

アクティビティのonCreate()イベントでは、AsyncTaskを開始してデータベースから商品データを取得しています。これが正常に完了したら、どのように表示を更新できますか?AsyncTask - 実行後、ビューを更新する方法は?

メタコード:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.venueviewbasic); 
      (..) 
    new GetProductDetails().execute(); 

class GetProductDetails extends AsyncTask<String, String, String> { 

    protected String doInBackground(String... params) { 

     // updating UI from Background Thread 
     runOnUiThread(new Runnable() { 
      public void run() { 
       // Check for success tag 
       int success; 
       try { 
        // Building Parameters 
        List<NameValuePair> params = new ArrayList<NameValuePair>(); 
        params.add(new BasicNameValuePair("id", vid)); 
     (.. retrieve and parse data and set new textview contents ..) 

textviewsなどは、しかし、更新されません。

答えて

15

あなたが

​​ を使用することができます 、その後で完全な処理の後、非同期からビューを更新する場合

しかし、バックグラウンドプロセスの実行中にデータを更新する場合は、を使用してください。元の場合 ...

protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100));<------ 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { <------- 
     setProgressPercent(progress[0]); 
    } 

詳細については、これはあなたを助けるthis link 希望を参照してください...!

+0

素晴らしい、私はそれが最初の部分はトリックをしたため、私はかなり長いリストビューを別の場所に更新することを検討します。ありがとう! :) – richey

+0

いつも歓迎しています... – MAC

+1

'myTextView.setText(result);'しようとすると、 'myTextViewは解決できません。そして、UIを読み込もうとすると、メソッドfindViewById(int)が型MyClassに対して未定義になります。 –

5

AsyncTaskクラスには、onPostExecuteメソッドを追加します。このメソッドはUIスレッドで実行され、任意のUIコンポーネントを更新できます。

 
class GetProductDetails extends AsyncTask<...> 
{ 
    ... 
    private TextView textView; 
    ... 
    protected void onPostExecute(String result) 
    { 
     textView.setText(result); 
    } 
} 

は(resultパラメータは、自分のクラスのdoInBackgroundメソッドから返された値である。)

+0

正確には、そのトリック、ありがとう!私はスレッドで直接ではなくonPostExecute()メソッドの表示を更新する必要があります。 – richey

+0

'myTextView.setText(result);'を試してみたら 'myTextViewを解決できません。 'そして、UIを読み込もうとすると、メソッドfindViewById(int)が型MyClassに対して未定義になります。 –

+0

答えは@FranciscoCorralesMoralesでしたか?私は同じ問題を取得しています – Yasha

7

asyncTaskが別のファイルにある場合は、UIビューを保持する方法についての質問があります。

この場合、非同期タスクにコンテキストを渡して、それを使用してビューを取得する必要があります。

class MyAsyncTask extends AsyncTask<URL, Integer, Long> { 

    Activity mActivity; 

    public MyAsyncTask(Activity activity) { 
     mActivity = ativity; 
    } 

そして、あなたのonPostExecuteに

int id = mActivity.findViewById(...); 

を使用するには、あなたがそのないUIスレッドから「doInBackground」からの眺めを更新することはできません覚えておいてください。

関連する問題