2010-08-16 34 views
18

Nếu tôi gọi đến một ContentProvider từ một Hoạt động, luồng nào đang chạy ContentProvider?Chủ đề nào chạy ContentProvider?

Ví dụ: Điều gì sẽ xảy ra nếu Activity bị giết và truy vấn đang thực hiện trong ContentProvider? Giả sử bạn có truy vấn mạng chậm f.ex.

Trả lời

18

Nếu bạn có nghĩa là các trường hợp sử dụng bình thường của việc sử dụng một ContentResolver để gọi một ContentProvider thì đây là những gì sẽ xảy ra theo sự hiểu biết của tôi:

  1. Tôi giả định trong ví dụ này mà ContentProvider bạn sống ở một quy trình và Hoạt động của bạn trong một quy trình khác.

  2. Nếu trình ContentProvider chưa được tạo thì phương thức onCreate() được gọi bằng cách sử dụng luồng "chính" của quy trình của ứng dụng.

  3. Phương thức truy vấn()/insert()/update()/delete() được gọi bằng cách sử dụng BinderThreads nằm xung quanh trong mọi quá trình ứng dụng chờ các lệnh đến từ các tiến trình khác.

Vậy điều gì xảy ra nếu Hoạt động đã kích hoạt truy vấn()/insert()/etc bị giết ở giữa một trong các cuộc gọi phương thức này? Tôi không thể nói chắc chắn nhưng tôi khá tự tin rằng bất cứ điều gì đang xảy ra trong ContentProvider sẽ tiếp tục vì quá trình ContentProvider sẽ không bị ảnh hưởng nhưng những gì xảy ra sau khi phương thức đó trả về tôi không thể nói chắc chắn.

Tôi không chắc chắn về cách mạng chậm sẽ tham gia vào việc này trừ khi nhà cung cấp nội dung của bạn được hỗ trợ bởi mạng thay vì db sqlite thông thường?

Làm rõ:

Có hai khả năng khi gọi một hàm ContentProvider (query/insert/update/delete/etc):

  1. ContentProvider của bạn đang trong quá trình tương tự như người gọi . Nếu vậy chức năng ContentProvider chạy đồng bộ trên cùng một luồng với người gọi.

  2. Trình ContentProvider của bạn đang trong quá trình khác với tư cách người gọi. Nếu như vậy hàm ContentProvider chạy trên một chuỗi liên kết trong quá trình ContentProvider.

Trong cả hai trường hợp, người gọi sẽ bị chặn cho đến khi hàm ContentProvider trả về. Như thường đọc tài liệu đầy đủ từ Google và/hoặc mã nguồn AOSP.

http://developer.android.com/reference/android/content/ContentProvider.html http://developer.android.com/guide/topics/providers/content-provider-basics.html http://developer.android.com/guide/components/processes-and-threads.html

+0

Điều gì sẽ xảy ra nếu Nhà cung cấp nội dung của bạn ở trong cùng một quy trình? –

+0

Nó thực sự không khác nhau, họ truy vấn/chèn/cập nhật/xóa các cuộc gọi vẫn xảy ra trên các chủ đề chất kết dính, chỉ trong cùng một quá trình kích hoạt cuộc gọi. Chúng sẽ không xuất hiện trên sợi chính, vì nó có thể gây ra ANR. – satur9nine

+0

Vì vậy, việc kích hoạt một resolver.delete() ví dụ từ phương thức onReceive() của người nhận phát sóng sẽ nằm trên luồng chính, đúng không? –

5

tôi stumbled khi điều này trong khi xử lý sự cố một vấn đề mà một quá trình từ xa (trừ UI) trong cùng một ứng dụng liên tục sẽ đẻ trứng cung cấp nội dung mỗi lần nó chạy một truy vấn. Thật không may, trừ khi bạn viết một cái gì đó tùy chỉnh, ContentProviders are never destroyed miễn là một tiến trình đang chạy. Nhà cung cấp nội dung thường chạy trong luồng xử lý giao diện người dùng (không mở), vì vậy trong trường hợp này của quá trình truy vấn từ xa, nó sẽ sinh ra một cá thể mới của trình cung cấp nội dung theo từng truy vấn vì quá trình riêng biệt đó (chuỗi giao diện người dùng) là không chạy vào thời điểm đó.

Có lẽ có một cách tốt hơn để làm điều này, nhưng thay vì chi tiêu một tấn nỗ lực rolling my own db or content provider để đóng db và tài nguyên trên mọi tạo, tôi phát hiện ra một cách giải quyết đơn giản.

Hóa ra có cùng khả năng chạy trong một quy trình riêng biệt như một dịch vụ. Vì vậy, trong ví dụ của tôi, tôi chỉ đơn giản là di chuyển các nhà cung cấp nội dung cho quá trình tương tự nơi dịch vụ từ xa được đặt. Sự cố được giải quyết, giờ đây nhà cung cấp nội dung chạy trong cùng một quy trình và chỉ sinh ra một lần miễn là dịch vụ đang chạy. Ngoài ra, hãy xem android:multiprocess attribute.

+2

"Trình cung cấp nội dung không bao giờ bị hủy" - có trong tài liệu không? Nếu không, đừng dựa vào nó. –

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