2011-01-03 22 views
20

Tôi đã bị lỗi này một lúc. Làm cách nào để xử lý đúng các thay đổi hướng màn hình trong khi tôi đang chạy riêng Thread/AsyncTask? Hiện nay, tôi cóXử lý các thay đổi hướng màn hình khi có AsyncTask chạy

android:configChanges="orientation|keyboard|keyboardHidden" 

trong AndroidManifest.xml của tôi, nhưng đó là not really encouraged:

Lưu ý: Sử dụng thuộc tính này nên tránh và sử dụng chỉ như là một cuối cùng khu nghỉ mát. Vui lòng đọc Xử lý các thay đổi thời gian chạy để biết thêm thông tin về cách xử lý đúng cách khởi động lại do thay đổi cấu hình.

Ngoài ra, trong 2.3 giả lập, nó hoạt động khi chuyển sang landscape, nhưng chuyển đổi trở lại portrait thất bại.

Bây giờ, lý do tại sao tôi sử dụng configChanges là vì khi người dùng chuyển hướng, tôi có thể đang chạy một số hoạt động mạng, và tôi không muốn nó dừng lại.

Có cách nào khác để thực hiện việc này hay không, có cách nào sửa chữa 2.3 để chuyển về chân dung không?

tôi biết về onRetainNonConfigurationInstance, nhưng tôi không chắc chắn nó sẽ là một ý tưởng tốt để "cứu" các trường hợp AsyncTask, chủ yếu là bởi vì lớp mà kéo dài AsyncTask không phải là tĩnh (vì vậy nó được gắn liền với Activity) - và nó cần phải được, bởi vì trong onPostExecute() nó gọi phương thức từ ví dụ Activity.

Trả lời

7

Tôi đã có một vấn đề tương tự với bạn và làm việc xung quanh nó bằng cách thực hiện các AsyncTask như là một phần của một lớp mà kế thừa từ Application lớp. Lớp học Application có sẵn trong suốt thời gian hoạt động của ứng dụng Vì vậy, bạn không phải lo lắng về việc bị ngắt quãng trừ khi toàn bộ đơn đăng ký sẽ bị hủy.

Để được thông báo khi công việc đã hoàn thành, Activity phải triển khai giao diện mà nó sử dụng để đăng ký chính nó vào lớp Application.

Khi ứng dụng của bạn bị hủy do xoay màn hình, bạn có thể hủy đăng ký Activity từ lớp Application và đăng ký lại khi nó được tạo lại. Nếu nhiệm vụ kết thúc giữa phá hủy và giải trí kết quả của hoạt động có thể được lưu trữ trong lớp Application trong khi đó Activity có thể kiểm tra xem tác vụ vẫn đang chạy hay kết quả đã có sẵn khi nó được tạo lại.

Một ưu điểm khác là bạn có quyền truy cập trực tiếp vào ngữ cảnh ứng dụng vì lớp Application là lớp phụ của lớp Context.

+0

Rất đẹp, đơn giản hơn nhiều so với việc triển khai 'Dịch vụ'. Cảm ơn. – Felix

+0

@ Tôi biết điều này đã được một thời gian kể từ khi đăng bài nhưng tôi đang cố gắng để làm như vậy nhưng tôi không hoàn toàn hiểu những gì bạn có nghĩa là bởi "Để được thông báo khi nhiệm vụ đã hoàn thành hoạt động đã thực hiện một giao diện mà nó sử dụng để đăng ký chính nó vào lớp Ứng dụng. " Bất kỳ cơ hội của một ví dụ? (Tôi mới sử dụng java và android1) – Bex

+0

Xin lỗi, tôi không có ví dụ về mã. Nhưng hãy xem [mẫu người quan sát] (http://stackoverflow.com/questions/2483644/rosetta-stone-observer-pattern) Tôi hy vọng bạn sẽ hiểu ý tôi với "đăng ký" (cập nhật()) và "thông báo" (addObserver()). – Flo

0

Tôi đã xuất hiện một câu hỏi tương tự here.

Về cơ bản, có example cách tạm dừng/tiếp tục AsynTask khi xoay thiết bị. Tuy nhiên nó vẫn không phù hợp cho tất cả các trường hợp (đôi khi không thể tạm dừng hành động một cách an toàn, chẳng hạn như tạo người dùng mới trên máy chủ từ xa). Đối với những trường hợp "không an toàn", bạn cần viết mã phần nào tôi muốn gọi là "khung công tác" phức tạp. Bạn sẽ thấy CommonsWare cung cấp các liên kết github cho một liên kết.

+0

Vì vậy, không có cách nào (dễ dàng) để giữ 'AsyncTask' chạy trong khi' Activity' đang được khởi động lại. Rất tiếc. Tuy nhiên, tôi phát hiện ra không chuyển đổi-back-to-gương điển hình là một vấn đề giả lập, kể từ khi các ứng dụng cài đặt làm điều tương tự. – Felix

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