2010-10-10 27 views
27

Tôi cần ứng dụng Android của mình để lưu trạng thái của nó vào đĩa khi hoạt động của nó được đặt ở chế độ nền hoặc bị giết. Nó đã được gợi ý rằng tôi bắt đầu một thread khi onPause() được gọi và thực hiện bất kỳ thủ tục I/O đắt tiền ở đó (xem Saving/loading document state quickly and robustly for image editor).Android xử lý các chuỗi nền khi rời khỏi Hoạt động như thế nào?

Trong trường hợp nào hệ điều hành sẽ xóa chuỗi và tần suất xảy ra các tình huống này?

Tôi giả định nó sẽ giống như cách hoạt động được xử lý nơi hệ điều hành có thể tùy ý quyết định hủy chuỗi nhưng chủ yếu sẽ chỉ làm điều này khi tài nguyên bị giới hạn. Nó sẽ là tốt đẹp để tìm một số tài liệu cụ thể của điều này mặc dù.

Từ khi phát xung quanh, với một số mã thử nghiệm, một chuỗi nền bắt đầu trong onPause() sẽ chạy vô thời hạn ở chế độ nền trên thiết bị của tôi (tôi đã thử tải rất nhiều ứng dụng và không thể làm cho nó bị giết).

Đối với ứng dụng cụ thể của mình, tôi đang viết trình chỉnh sửa bitmap nơi tôi đang sử dụng mẫu Command và mẫu Memento để cho phép hoàn tác và làm lại các chỉnh sửa. Tôi muốn người dùng có thể hoàn tác/làm lại các chỉnh sửa của họ, ví dụ: người dùng nhận cuộc gọi điện thoại và hoạt động bị giết khi được đặt ở chế độ nền. Giải pháp tốt nhất tôi có thể nghĩ là sử dụng chuỗi nền để liên tục lưu lệnh và vật lưu trữ vào đĩa trong khi sử dụng ứng dụng và kết thúc lưu bất kỳ đối tượng nào còn lại trong chuỗi nền nếu onPause được gọi. Trong trường hợp xấu hơn, nếu thread bị giết tôi sẽ chỉ mất một số chỉnh sửa.

Trả lời

21

Trong trường hợp nào hệ điều hành sẽ hủy chuỗi và tần suất xảy ra các tình huống này?

Hệ điều hành sẽ không giết chuỗi, trừ khi quá trình này đang giết chết - Android không làm bất kỳ điều gì với chủ đề bạn tự tạo. Nếu bạn là quá trình tiền cảnh, bạn sẽ không bị giết. Các tỷ lệ cược của Android giết chết quá trình trong vòng một vài giây của bạn mất tiền cảnh (sau onPause()) là rất nhỏ. Tài liệu về thời gian xử lý - những gì có trong đó - có thể được tìm thấy here.

+1

Chỉ cần làm rõ, nếu bạn tạo một chuỗi trong quá trình được đính kèm với một số hoạt động, chuỗi này sẽ bị giết khi hoạt động bị giết (tức là quy trình và chuỗi được liên kết)? – memcom

+2

@tifftuff: Một hoạt động không phải là một ứng dụng. Một hoạt động là một thành phần của một ứng dụng. Một ứng dụng có thể có nhiều thành phần, bao gồm nhiều hoạt động, dịch vụ, vv Khi thành phần cuối cùng của một ứng dụng bị phá hủy (ví dụ, người dùng nhấn BACK từ hoạt động một và chỉ trong một ứng dụng nhỏ), quy trình được dành cho tái chế hoặc chấm dứt. KHÔNG LẤY NHỮNG THREADS. Nếu bạn bắt đầu chủ đề, bạn phải sắp xếp cho nó chấm dứt, vì Android sẽ không chấm dứt nó cho bạn, ngoài việc chấm dứt quá trình, điều này có thể không xảy ra trong một vài tuần. – CommonsWare

+0

Cảm ơn. Bạn có bất kỳ đề xuất nào về việc liệu một Dịch vụ có phù hợp hơn để sử dụng hơn là một chuỗi cho nền tảng này không? – memcom

1

Thông thường, hãy lưu trạng thái của bạn ở là điều đúng đắn cần thực hiện nếu nó nhanh chóng. Tôi không nghĩ rằng nó được ghi lại rõ ràng khi một quá trình bị giết, nhưng đôi khi bạn thấy nó trong logcat khi bạn chạy một số ứng dụng đòi hỏi (nói, sau khi chạy Google Earth và Trình duyệt).

Ngoài ra còn có một tùy chọn trong Android DevTools để tự động hủy các hoạt động khi bạn điều hướng khỏi chúng, mặc dù điều đó có thể không mở rộng đến quy trình. (DevTools có trên trình giả lập và trên một số điện thoại gốc).

Tôi nghĩ âm thanh tiếp cận của bạn hợp lý - hãy sử dụng chuỗi có mức độ ưu tiên thấp để liên tục cập nhật dữ liệu và ưu tiên bình thường ở chế độ onPause và đặt cờ ở chế độ onPause để nó chấm dứt sau khi kết thúc.

Rõ ràng, bạn sẽ cần đảm bảo rằng bạn không gặp sự cố đồng bộ hóa nếu bạn truy cập onResume ngay lập tức sau onPause (tức là trong khi luồng vẫn đang bận lưu).

5

Chủ đề của bạn có thể bị giết bất cứ lúc nào sau khi hoạt động bị hủy hoặc có thể không bao giờ bị giết. Tùy thuộc vào một chủ đề như vậy là hình thức rất xấu - bạn có thể kết thúc với một nửa hoạt động hoàn thành, hoặc với một sợi mà dính xung quanh mãi mãi.

Nếu bạn muốn thực hiện thao tác nền tiếp tục ngay cả khi không có hoạt động tiền cảnh, bạn hầu như luôn muốn chạy nó bên trong Dịch vụ.Mặt khác, dịch vụ là ít khả năng bị bị giết, nhưng không đảm bảo trừ khi bạn sử dụng "startForeground". Điều này sẽ kết thúc hiển thị một thông báo cho người dùng rằng một cái gì đó đang xảy ra trong nền, nhưng theo như tôi biết đó là cách duy nhất để chạy một chuỗi nền không đồng bộ được đảm bảo không bị giết.

Thành thật mà nói, câu trả lời đúng là đảm bảo rằng không bao giờ có bất kỳ trạng thái xử lý tạm thời nào sẽ mất nhiều thời gian để lưu. Nếu bạn phải viết một tệp lớn để phản ánh một vài thay đổi của người dùng, hãy xem xét việc duy trì "nhật ký giao dịch" mà bạn có thể sử dụng để tạo hoạt động lưu có thể khởi động lại. Với điều này, bạn có thể chạy một cách an toàn các khoản tiết kiệm của bạn trong một dịch vụ và biết rằng ngay cả khi nó bị giết, nó sẽ tự động được khởi động lại khi tài nguyên có sẵn.

+0

Chủ đề sẽ chấm dứt trong khoảng 5 giây khi tôi đợi để xác nhận dữ liệu của tôi được ghi vào đĩa (khoảng 2Mb giá trị). Trình tải tự động của tôi sẽ xem xét rằng chuỗi có thể bị xóa trước khi kết thúc và người dùng có thể mất 30 giây công việc. Bạn không nghĩ rằng bắt đầu một dịch vụ cho điều này là một chút nặng trọng lượng? Tôi có thể tạo nhật ký giao dịch của các hoạt động chỉnh sửa nhưng chúng cũng cần được lưu vào đĩa khi thoát (nơi nào khác tôi có thể lưu trữ nhanh chóng?) Và người dùng có thể chỉnh sửa lớn và sau đó bị gián đoạn. – memcom

+1

Bắt đầu một dịch vụ mới hoàn toàn * không * quá nặng. Đây là cách được khuyến nghị để làm những việc khi, ví dụ, xử lý một thông báo Widget nếu nó sẽ mất hơn một giây hoặc lâu hơn. Dịch vụ cung cấp * chính xác * những gì bạn đang tìm kiếm - hệ thống sẽ nhận ra rằng họ có lý do chính đáng để bám sát và sẽ cố gắng tránh việc tiêu diệt chúng một cách vô tình, vì vậy bạn có thể tự tin hơn nhiều để có được 5 giây xử lý nền. Có vẻ như bạn đã sẵn sàng cho trường hợp hiếm hoi nơi dịch vụ cần phải bị giết, vì vậy đó là tất cả những gì bạn cần. – beekeeper

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