2009-07-22 28 views
6

Đây là thỏa thuận: Tôi có một ứng dụng Android cần gọi dịch vụ web sau mỗi giây X (hiện tại là 60 giây). Ứng dụng này có nhiều tab và tất cả các tab này cần phải tương tác với chính dữ liệu. Một là một MapView, một là một ListView và sau đó thứ ba là không liên quan nhưng cũng sẽ cần phải có được một số dữ liệu toàn cầu cuối cùng. Vấn đề là tôi muốn hoạt động chính của tôi có một chuỗi chạy trong nền, nhận được kết quả và sau đó hướng dẫn cả hai hoạt động của trẻ trong TabHost để tự cập nhật dữ liệu mới nhất. Ngoài ra, khi người dùng nhấp vào các tab và hoạt động onCreate/onResume, tôi cũng muốn buộc vẽ lại bằng cách lấy dữ liệu mới nhất từ ​​hoạt động chính. Tôi thực sự thua lỗ ở đây. Tôi đã thử điều này với một dịch vụ và một số phương pháp tĩnh ghetto để chuyển một phiên bản Hoạt động tới Dịch vụ để gọi các chức năng cụ thể để cập nhật lượt xem của họ bất cứ khi nào bộ hẹn giờ bị sa thải, nhưng sự chậm lại khá tệ và mã chỉ xấu xí xấu xí . Bất kỳ đề xuất?Cách tốt nhất để thực hiện liên lạc hoạt động liên thông trong ứng dụng Android TabHost

chỉnh sửa: Vì vậy, tôi đã thực hiện nó như một chuỗi định thời gian trong hoạt động tabhost và sau đó tôi có chuỗi định thời gian trong mỗi hoạt động con sau đó lấy dữ liệu (theo kiểu đồng bộ) và cập nhật bản đồ/danh sách của chúng. Nó nhanh hơn nhiều nhưng vẫn cảm thấy hơi hack-ish, đặc biệt là phần mà tôi gọi một chức năng tùy chỉnh trong hoạt động cha mẹ như vậy:

((MainActivity)getParent()).getNearbyMatches(); 

này sẽ thêm một phần tử của khớp nối mạnh rằng tôi không hoàn toàn vui mừng với, nhưng từ một quan điểm hiệu suất nó tốt hơn nhiều so với nó được. Tôi đánh giá cao các câu trả lời đã được đưa ra và sẽ thực hiện một chút nghiên cứu về mặt trước của nhà cung cấp nội dung nhưng tôi không chắc chắn tôi muốn quay lại mô hình dịch vụ.

+0

Tôi ước mình cũng biết cách làm điều này!+1 – cakeforcerberus

Trả lời

7

Vì vậy, tôi đã tìm thấy những gì tôi tin là câu trả lời: The Application Class. Bạn có thể mở rộng lớp này để theo dõi trạng thái ứng dụng toàn cầu.

Trong tệp AndroidManifest.xml bạn có thể tham chiếu lớp tùy chỉnh đủ điều kiện của mình trong thuộc tính android:name và nó sẽ được khởi tạo khi ứng dụng kích hoạt.

Mọi hoạt động sau đó có thể gọi "getApplication()" và nó sẽ trả về phiên bản của lớp Ứng dụng tùy chỉnh của bạn, sau đó bạn có thể điều chỉnh theo sở thích.

+0

và làm cách nào tôi có thể kiểm tra trong lớp người nhận nếu hoạt động cần khởi chạy, đã chạy? – bofredo

1

Bạn có thể triển khai các cập nhật GUI trong Handler s và đăng ký các trường hợp Handler với chuỗi tải xuống của bạn. Chuỗi tải xuống sau đó gửi tin nhắn đến các trình xử lý khi dữ liệu mới đến. Về cơ bản đây là Observer Pattern. Bạn có thể tìm thấy ví dụ về cách sử dụng Handler s here (mở rộng phần 'Ví dụ tiến trìnhDialog với chuỗi thứ hai').

5

Tại sao bạn cập nhật tất cả các hoạt động của trẻ em mỗi lần có dữ liệu mới? Điều đó nghe có vẻ không hiệu quả với tôi. Chỉ cập nhật hoạt động hiện đang hiển thị.

Một cách có thể thực hiện điều này là thông qua custom content provider. Cho phép dịch vụ của bạn cập nhật nguồn dữ liệu cho các hoạt động của bạn và nhận hoạt động hiển thị hiện tại để nghe những thay đổi về nội dung này. Về cơ bản, đăng ký của bạn với nhà cung cấp nội dung khi OnResume được gọi và hủy đăng ký khi OnPause được gọi.

Theo quy tắc chung, không bao giờ lưu trữ các tham chiếu tĩnh của một Hoạt động !! Bạn sẽ kết thúc với rò rỉ xấu xí. Nếu nó là phải cho ứng dụng của bạn thì ít nhất sử dụng WeakReferences

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