2012-02-16 40 views
12

Tôi đang sử dụng Phân đoạn và Trình quản lý tải. Tôi phải khởi chạy một số nhiệm vụ không xác định và chúng có thể chạy song song (nếu không tôi chỉ sử dụng lại một và chỉ một trình tải). Ví dụ, tôi có một listview, và mỗi hàng có thể có một nút để lưu nội dung của hàng đó vào một máy chủ web. Người dùng có thể bắt đầu yêu cầu lưu trên nhiều mục song song.Mẫu cho nhiều Trình tải với Trình quản lý tải?

private int nextId = 0; 

private void onClickListener() { 
    Bundle bundle = new Bundle(); 
    bundle.putNextData(...); 
    getLoaderManager().initLoader(nextId++, bundle, this); 
} 

tôi có thể thử kế toán bản thân mình, vì vậy tạo ra một hồ bơi của bộ tải bằng tay và tái sử dụng chúng khi có thể, có vẻ như nó có thể được một cái gì đó đã được thực hiện bởi các API?

Cảm ơn

+1

Câu hỏi hay. Bạn đã quản lý để giải quyết nó? Tôi nghĩ rằng bạn nên bằng cách nào đó xếp hàng nhiệm vụ của bạn. –

Trả lời

4

Tôi không nghĩ bạn nên sử dụng Trình tải để lưu dữ liệu vào máy chủ từ xa.

Thay vào đó, hãy sử dụng một số IntentService hoặc thứ gì đó tương tự để xử lý hàng đợi hoạt động "lưu". Bằng cách này, thông tin liên lạc của bạn với máy chủ web có thể được nhóm, thu gọn (tức là nhiều lần lưu hàng đợi cho một mục có thể được thu gọn thành một hoạt động) và sẽ vượt quá tuổi thọ hoạt động của bạn nếu cần.

Một lưu hàng đợi xử lý bởi một IntentService (hoặc tương đương) cũng là một cách tuyệt vời để thử lại hoạt động thất bại với backoff, vì bạn có thể thực hiện lần thử lại chậm với backoff mũ sử dụng AlarmManager.

+0

Và nếu tôi có danh mục 'n' trong cơ sở dữ liệu và tôi muốn tải chúng bằng cách sử dụng' CursorLoader'. Tôi nên sử dụng id nào? – pixel

+1

Bạn chắc chắn có thể sử dụng ID tùy ý và có thể chỉ là số nguyên 1..n nếu các danh mục là tĩnh. Nếu bạn lần đầu tiên tải danh sách các danh mục và sau đó chi tiết về từng danh mục thì có thể bạn cần phải tối ưu hóa truy vấn của mình. Nhưng giả sử bạn không có tùy chọn nào khác, bạn nên sử dụng id ổn định làm id Trình tải, chứ không phải ví dụ vị trí con trỏ. –

1

Dịch vụ IntentService hoặc dịch vụ ràng buộc luôn là cách tiếp cận tốt cho điều đó. Là điểm La Mã, lưu ý rằng việc yêu cầu một số yêu cầu và gọi riêng là không được khuyến khích (rất có thể bạn cung cấp nhiều công việc cho kết nối radio) khi sử dụng dữ liệu - trong số những thứ khác tiêu hao pin của bạn. về điều đó)

Cá nhân tôi khuyên bạn nên sử dụng dịch vụ bị ràng buộc với hàng đợi yêu cầu và nhóm chủ đề sẵn có (cách tiếp cận đó cho phép bạn kiểm soát đầy đủ các hoạt động mạng phức tạp hơn trong trường hợp của bạn). Có nhiều chi tiết hơn về cách tiếp cận here và ví dụ làm việc về testcase trên here.

Cập nhật cho chúng tôi về tiến trình của bạn.

0

Bạn đang đi đúng hướng, hãy để tôi giúp bạn một chút.

Dùng lại thực sự là một ý tưởng tốt, và bạn không phải lo lắng về điều đó vì Android đã làm điều đó cho bạn (Hoặc Java thực sự;)

Nó gọi ThreadPoolExecuter, bạn có thể bắt đầu như nhiều nhiệm vụ như bạn muốn và anh ta sẽ chỉ mở số lượng các chủ đề được xác định trước (thực hành tốt nhất là cố gắng mở nhiều luồng như kết nối mạng song song có thể chạy trên thiết bị. Từ nghiên cứu của tôi nó là từ 4 đến 9).

Và nếu bạn đang cố gắng tải xuống cùng một URL hai lần, bạn có thể tự bảo vệ mình và chỉ mở một tác vụ cho nó.

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