2013-03-05 43 views
5

Tôi có AsyncTask cập nhật triển khai tiến trình ActionBarSherlock. Bằng cách nào đó onProgressUpdate đang ném một lỗi luồng mặc dù nó tuyên bố thực thi trên luồng giao diện người dùng.AsyncTask Không cập nhật trên chuỗi giao diện người dùng

protected void onProgressUpdate(Integer... values) 
{ 
    setSupportProgress(values[0]); 
} 

Lỗi này là:

03-06 00: 13: 11,672: E/AndroidRuntime (4183): tại com.anthonymandra.framework.GalleryActivity $ ShareTask.onProgressUpdate (GalleryActivity.java: 476)

Chỉ chuỗi ban đầu đã tạo phân cấp chế độ xem mới có thể chạm vào chế độ xem .

Theo như tôi có thể nói tôi nên truy cập vào thread UI cho điều này ...

Tôi có nhiều AsyncTasks làm việc trong ứng dụng của tôi, nhưng theo yêu cầu đây là doInBackground (giản thể):

for (MediaObject image : toShare) 
{ 
    BufferedInputStream imageData = image.getThumbStream(); 
    File swapFile = getSwapFile(...); 
    write(swapFile, imageData); 
    ++completed; 
    float progress = (float) completed/toShare.size(); 
    int progressLocation = (int) Math.ceil(progressRange * progress); 
    onProgressUpdate(progressLocation); 
} 
+2

bạn có thể đăng theo dõi ngăn xếp hay không. bạn có chắc nó không phải là thứ gì đó trong 'doInBackground'? – JRomero

+2

Bạn có thể đăng phương thức 'doInBackground()' và/hoặc 'setSupportProgress()' không? –

+0

@Anthony xin vui lòng gửi một bản cập nhật như những gì sai lầm để người dùng khác không tìm kiếm cái gì đó không tồn tại. – JRomero

Trả lời

4

Được rồi, vậy vấn đề là bạn đang gọi onProgressUpdate khi bạn nên gọi publishProgress. OP đã tự tìm ra bản thân mình nên tôi chỉ cần sao chép nó để anh ấy/cô ấy không cần phải chờ đợi để chấp nhận câu trả lời. Dưới đây là thông tin về cách AsyncTask hoạt động và đó là kiến ​​thức tốt.


Bạn đang tạo AsyncTask trên chuỗi giao diện người dùng? Nếu bạn không phải là vấn đề. onProgressUpdate sẽ được chạy trên chuỗi tạo ra AsyncTask.

Cập nhật: Hãy để chúng tôi có một số thời gian đào mã (mã nguồn API 15)!

protected final void publishProgress(Progress... values) { 
    if (!isCancelled()) { 
     sHandler.obtainMessage(MESSAGE_POST_PROGRESS, 
       new AsyncTaskResult<Progress>(this, values)).sendToTarget(); 
    } 
} 

Người này sẽ gọi số này là tĩnh Handler sHandler. documentation nói:

Khi bạn tạo một Trình xử lý mới, nó sẽ bị ràng buộc vào hàng đợi luồng/thư của chuỗi đang tạo - từ thời điểm đó, nó sẽ gửi tin nhắn và hàng đợi đến hàng đợi tin nhắn đó thực hiện chúng khi chúng xuất hiện trong hàng đợi tin nhắn.

Nhờ Bruno Mateus với tài liệu hướng dẫn kỹ năng look-up của mình:

Nhìn đó, tôi tìm thấy tại trang tài liệu: quy tắc Threading - Có một vài quy tắc luồng phải được theo dõi trong lớp này để làm việc đúng: - Lớp AsyncTask phải được tải trên chuỗi giao diện người dùng. Điều này được thực hiện tự động như của JELLY_BEAN. - Ví dụ nhiệm vụ phải là được tạo trên chuỗi giao diện người dùng. thực thi (Params ...) phải được gọi trên giao diện người dùng . - Không gọi onPreExecute(), onPostExecute (Kết quả), doInBackground (Params ...), onProgressUpdate (Progress ...) theo cách thủ công. - Nhiệm vụ có thể được thực thi chỉ một lần (một ngoại lệ sẽ bị ném nếu thực hiện một lần thực thi thứ hai là .)

+1

Bạn có thể cung cấp bằng chứng về điều này không? Tài liệu nói rằng nó sẽ 'Chạy trên chuỗi giao diện người dùng'. Không phải chuỗi đã bắt đầu AsyncTask. – JRomero

+0

Và liên kết: http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate%28Progress...%29 –

+0

Được gọi trong OnShareTargetSelected. Tôi tưởng tượng điều này sẽ xảy ra trên thread UI nhưng tôi cho rằng nó có thể là một chủ đề mới. Tôi sẽ thử thực thi AsyncTask trên chuỗi giao diện người dùng. Nếu điều này làm việc nó thực sự thực sự cần phải được tài liệu tốt hơn. – Anthony

1

Bạn có thể tuyên bố AsyncTask bạn như là một innerclass hoạt động của bạn như thế:

public void onClick(View v) { 
    new DownloadImageTask().execute("http://example.com/image.png"); 
} 

private class DownloadImageTask extends AsyncTask { 
     protected Bitmap doInBackground(String... urls) { 
      return loadImageFromNetwork(urls[0]); 
    } 

    protected void onPostExecute(Bitmap result) { 
      mImageView.setImageBitmap(result); 
    } 
} 
+0

OP đã đăng bài này làm nhận xét về câu hỏi của tôi: "Tôi đã bọc AsyncTask trong runOnUiThread. Lỗi tương tự." Tôi đặt cược vấn đề của anh ta nằm ở nơi khác. –

+0

Nó là một lớp bên trong. Tôi đã hy vọng sẽ đơn giản hóa câu hỏi. Tôi đoán tôi nên rõ ràng. – Anthony

1

Tôi đã tự gọi:

onProgressUpdate 

Bạn nên gọi

publishProgress 

Lỗi dễ dàng, nhưng thông tin tuyệt vời. Simon và Bruno xứng đáng với tín dụng, đăng câu trả lời nếu bạn thích. Cảm ơn bạn đã phản hồi nhanh và rộng rãi!

+0

Bạn được chào đón, tôi vui vì bạn đã tìm ra vấn đề! –

+0

Bạn được chào đón! –

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