2013-02-04 33 views
7

Sử dụng trường hợp:Xử lý thay đổi hướng với chạy AsyncTask

Người dùng bắt đầu ứng dụng đó sẽ được tải một hình ảnh xác thực. Người dùng điền vào hình ảnh xác thực và cố tải xuống một số thông tin.

Vấn đề:

Nếu người dùng xoay thiết bị trong khi tải các Activity bị phá hủy. Khi kết thúc việc thực hiện AsyncTask đang cố gắng cập nhật Activity bị hủy và kết quả "Chế độ xem không được đính kèm với trình quản lý cửa sổ".

"Wrong" giải pháp:

tôi có thể che dấu vấn đề với một android:configChanges="orientation|keyboardHidden|screenSize" nhưng với cách bố trí này sẽ không được cập nhật để cảnh quan.

Những gì tôi hỏi:

Có thể thay đổi hướng và thay đổi "tham khảo" của bối cảnh truyền cho AsyncTask?

Điều này answer đề xuất kiểm tra xem hộp thoại có không phải là không, nhưng không phải là những gì tôi đang tìm kiếm.

Here anh ấy đề nghị sử dụng WeakReference (here một đoạn trích đẹp về cách sử dụng nó) nhưng tôi không hiểu đó có phải là điều tôi đang tìm kiếm hay không.

Để rõ ràng hơn đây là những gì tôi đang làm trong onPostExecute:

@Override 
protected void onPostExecute(Auto result) { 
    progress.dismiss(); 
    new DownloaderCaptcha(context).execute(""); 
    ((EditText)context.findViewById(R.id.editTextCaptcha)).setText(""); 
    context.findViewById(R.id.progrBar).setVisibility(View.VISIBLE); 
    context.findViewById(R.id.captcha).setVisibility(View.INVISIBLE); 

    if(result != null) { 
     Storage.storeHistory(context, result.getTarga().getValue()); 

     Intent i = new Intent(context, MenuActivity.class); 
     i.putExtra("result", result); 
     context.startActivity(i); 
    } else { 
     ErrorDialog.show(context, error); 
    } 
} 
+0

Đó không phải là câu trả lời hay nhất nhưng bạn có thể giữ ref trên asyncTask và chuyển nó vào hoạt động phong cảnh của mình. Các hoạt động cảnh quan sau đó sẽ cập nhật bối cảnh asynctask ... Nhưng tôi không biết điều gì sẽ xảy ra nếu ascncTask của bạn kết thúc trong quá trình chuyển đổi hoạt động (nhưng có những giải pháp đơn giản cho vấn đề này). – Xval

+0

@matiash: không cần phải downvote, cũng bởi vì nếu bạn nhìn vào thời điểm khi câu trả lời đã được đăng, nó đã được ngay sau khi Alex đăng bài này! Vì vậy, vào thời điểm đó không có câu trả lời hay cho câu hỏi của tôi. Rõ ràng bạn có thể gắn cờ nó như là một bản sao, nhưng một downvote có nghĩa là một thiếu nghiên cứu, không phải trường hợp của tôi tôi đoán. Chỉ cần hai xu của tôi. – Enrichman

+0

@Enrichman Tôi đã không downvote nó. Tôi đồng ý đó là một câu hỏi hay, nó chỉ là một bản sao. – matiash

Trả lời

15

Dưới đây là lời khuyên của tôi:

  • Do không sử dụng android:configChanges để giải quyết vấn đề này.

  • Làm không sử dụng Activity#onRetainNonConfigurationInstance() để giải quyết hoặc (do cách tiếp cận này không còn được dùng nữa).

  • Thay vào đó, hãy sử dụng công nhân được giữ lại Fragment. Gần đây, tôi đã posted an article mô tả cách xử lý các thay đổi cấu hình bằng cách giữ lại Fragment s. Nó giải quyết vấn đề giữ lại một AsyncTask qua một thay đổi luân phiên độc đáo. Về cơ bản, bạn cần lưu trữ số AsyncTask bên trong số Fragment, gọi setRetainInstance(true) trên số Fragment và báo cáo kết quả/tiến trình của AsyncTask về số Activity thông qua số được giữ lại Fragment.

+1

Tôi đang gặp phải một số sự cố khi cố thực hiện điều này nhưng tôi đoán đó là giải pháp tốt nhất. Cảm ơn. :) – Enrichman

+0

Tôi thích câu trả lời này rất nhiều. :) – Alex

0

"Wrong" giải pháp:

tôi có thể che dấu vấn đề với một android : configChanges =" keyboardHidden | screenSize "nhưng với bố cục này sẽ không được cập nhật thành cảnh quan.

Thực tế là như vậy.

android: configChanges Thay đổi cấu hình danh sách hoạt động sẽ tự xử lý. Khi thay đổi cấu hình xảy ra trong thời gian chạy, hoạt động bị tắt và khởi động lại theo mặc định, nhưng tuyên bố cấu hình với thuộc tính này sẽ ngăn hoạt động này bị khởi động lại . Thay vào đó, hoạt động vẫn chạy và phương thức onConfigurationChanged() của nó được gọi.

Hãy xem http://developer.android.com/guide/topics/manifest/activity-element.html#config

Bạn có thể thực hiện bố trí cho cả hai chế độ Landscape và Portrait hoặc hủy AsyncTask của bạn về biến đổi cấu hình.

+0

Tất nhiên là tôi có. Nó sẽ thay đổi hướng nhưng bố cục được sử dụng là định hướng được xác định cho chế độ dọc. – Enrichman

+0

Tôi đã cập nhật câu trả lời. – EvZ

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