2012-11-19 12 views
9

Tôi đang phát triển một ứng dụng yêu cầu nhiều tệp được tải xuống đồng thời. Tôi đang tạo một AsyncTask với riêng HttpClient cho mỗi tệp, nhưng tệp tiếp theo chỉ bắt đầu tải xuống sau khi tệp trước đó kết thúc.Yêu cầu HttpClient đồng thời sử dụng nhiều AsyncTasks

Có thể đó là sự cố phía máy chủ không?

+0

Bạn có thể cung cấp mã cho AsyncTask hoặc mã gọi nó? –

Trả lời

20

Đó là vì quản lý AsyncTask thay đổi trong Honeycomb. Trước đây nếu bạn bắt đầu, tức là 3 AsyncTask, chúng đã chạy đồng thời. Vì HC, nếu targetSdk của bạn được đặt thành 12 hoặc cao hơn, chúng được xếp hàng đợi và thực hiện từng cái một (xem this discussion). Để làm việc đó xung quanh bắt đầu AsyncTasks bạn theo cách đó:

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 

thay vì:

task.execute(params); 

Nếu bạn cũng nhắm mục tiêu Androids cũ hơn, bạn cần có mã điều kiện:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
} else { 
    task.execute(params); 
} 

hoặc bọc nó trong một lớp trợ giúp riêng biệt:

public class Utils { 

    public static <P, T extends AsyncTask<P, ?, ?>> void executeAsyncTask(T task) { 
     executeAsyncTask(task, (P[]) null); 
    } 

    @SuppressLint("NewApi") 
    public static <P, T extends AsyncTask<P, ?, ?>> void executeAsyncTask(T task, P... params) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
     } else { 
      task.execute(params); 
     } 
    } 
} 

và cách sử dụng sẽ là:

Utils.executeAsyncTask(new MyAsyncTask()); 
+1

Cảm ơn bạn rất nhiều. –

+1

Lưu ý nếu bạn định gửi yêu cầu HTTP song song bằng cách sử dụng trình quản lý nhóm Thread, bạn cần xem tại đây: Cách kiểm tra Threadpool cho các yêu cầu hiện tại đang được gửi nếu không nó sẽ từ chối với RejectedExecutionException http://stackoverflow.com/questions/12074985/java-util-concurrent-rejectexecutionexception-in-async-task-android – Abs

+0

Câu trả lời hay! Giúp ích nhiều nhất cho tôi! –

0

Dường như bạn share an instance of HttpClient across your application và cung cấp cho AsyncTasks phương pháp riêng của họ. By the by, tôi hoàn toàn nhận thức được rằng liên kết là dành cho phiên bản cũ, nhưng tài liệu dường như không được cập nhật cho 4.x.

1

Khi lần đầu tiên được giới thiệu, AsyncTasks được thực hiện serially trên một chuỗi nền đơn. Bắt đầu với DONUT, điều này đã được thay đổi thành một nhóm các luồng cho phép nhiều tác vụ hoạt động song song. Bắt đầu với HONEYCOMB, các tác vụ được thực thi trên một luồng đơn để tránh các lỗi ứng dụng phổ biến do thực thi song song. Source

Vì vậy, tùy thuộc vào phiên bản AsyncTask sẽ không thực thi song song. Đối với nhiệm vụ như tập tin tải về, bạn nên sử dụng hồ bơi thread sử dụng Executor

hoặc bạn có thể sử dụng phương pháp executeOnExecutor ..