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.
Đ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? –
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
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? –