2012-05-13 20 views
9

Trong sự kiện onCreate() của một Hoạt động, tôi đã khởi động AsyncTask để truy xuất dữ liệu Sản phẩm từ cơ sở dữ liệu. Sau khi điều này đã được hoàn tất thành công, làm thế nào tôi có thể cập nhật màn hình?AsyncTask - sau khi thực hiện, cách cập nhật chế độ xem?

Metacode:

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 ..) 

TextView vv không được cập nhật tuy nhiên.

Trả lời

15

Nếu bạn muốn cập nhật nhìn từ async sau khi quá trình hoàn tất trong sau đó bạn có thể sử dụng

protected void onPostExecute(String result) 
    { 
     textView.setText(result); 
    } 

Nhưng nếu bạn muốn cập nhật dữ liệu trong khi chạy quá trình nền thì hãy sử dụng. Đối với cựu ...

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]); 
    } 

để xem chi tiết hơn thấy this link Hy vọng điều này sẽ giúp bạn ...!

+0

tuyệt vời, tôi sẽ xem xét rằng để cập nhật listview khá dài của tôi ở một nơi khác, bây giờ phần đầu tiên đã làm các trick. Cảm ơn! :) – richey

+0

bạn luôn được chào đón @richey ... – MAC

+1

Tôi nhận được 'myTextView không thể được giải quyết' nếu tôi thử' myTextView.setText (kết quả); '. Và tôi nhận được 'Phương thức findViewById (int) là không xác định cho kiểu MyClass' nếu tôi cố gắng tải giao diện người dùng. –

5

Trong lớp AsyncTask của bạn, hãy thêm phương thức onPostExecute. Phương thức này thực hiện trên luồng giao diện người dùng và có thể cập nhật bất kỳ thành phần giao diện người dùng nào.

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

(Tham số result là giá trị trả về từ phương pháp doInBackground của lớp học của bạn.)

+0

chính xác, điều đó đã thực hiện mẹo, cảm ơn !! Tôi phải cập nhật hiển thị trong phương thức onPostExecute() thay vì trực tiếp trong chuỗi. – richey

+0

Tôi nhận được 'myTextView không thể được giải quyết' nếu tôi thử' myTextView.setText (kết quả); '. Và tôi nhận được 'Phương thức findViewById (int) là không xác định cho kiểu MyClass' nếu tôi cố gắng tải giao diện người dùng. –

+0

Bạn đã nhận được câu trả lời của mình @FranciscoCorralesMorales. Tôi nhận được cùng một vấn đề – Yasha

7

Tôi đoán câu hỏi là nhiều hơn về cách giữ Chế độ xem giao diện người dùng nếu asyncTask nằm trong một tệp riêng biệt.

Trong trường hợp đó, bạn phải chuyển ngữ cảnh cho tác vụ Async và sử dụng công cụ đó để có chế độ xem.

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

    Activity mActivity; 

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

Và sau đó trong onPostExecute bạn sử dụng

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

Hãy nhớ rằng bạn không thể cập nhật Xem từ "doInBackground" vì nó không phải là thread UI.

Các vấn đề liên quan