2013-07-28 25 views
5

Trong ứng dụng của tôi, tôi đang hiển thị hộp thoại trong quá trình nền chạy dài, là phương thức.
Hộp thoại này bị loại bỏ khi trả về android từ tác vụ nền.Kiểm tra xem hộp thoại có thể được loại bỏ một cách an toàn

final ProgressDialog progressDialog = ProgressDialog.show(activity, "", "Doing something long running", true, true); 

new Thread(new Runnable() { 
    public void run() { 
     someLongRunningCode(); // (not using AsyncTask!) 

     activity.runOnUiThread(new Runnable() { 
      public void run() { 
       progressDialog.dismiss(); 
      } 
     }); 
    } 
}).start(); 

Bây giờ, khi người dùng xoay thiết bị của mình trong khi quá trình nền vẫn chạy hoạt động được tái tạo và do đó, tiến trình được tách ra khỏi hoạt động.
Khi quá trình chạy dài được thực hiện, android rõ ràng sẽ cố gắng ẩn hộp thoại tiến trình (hiện đã tách rời) và sau đó dẫn đến một ngoại lệ: java.lang.IllegalArgumentException: View not attached to window manager.
Có cách nào để kiểm tra xem có an toàn khi loại bỏ hộp thoại không?

Chỉnh sửa: Hoặc vẫn tốt hơn, có cách nào để đính kèm hộp thoại hiện có vào hoạt động mới được tạo không?
Một hộp thoại nhân bản mới sẽ vẫn ổn.

Trả lời

3

Chỉ cần nắm bắt ngoại lệ và bỏ qua nó. Quyết định của Android để khởi động lại hoạt động khi xoay vòng làm cho các luồng có một vài ngoại lệ lạ như thế. Nhưng kết quả cuối cùng bạn muốn là không có hộp thoại nào được hiển thị. Nếu bạn chỉ bắt ngoại lệ, không có hộp thoại nào được hiển thị. Vì vậy, bạn tốt.

Nếu bạn không sử dụng bố cục/hình vẽ riêng cho cảnh quan và dọc, bạn chỉ có thể ghi đè lên configChange trong tệp kê khai của mình để hoạt động không hoạt động (nó vẫn xoay và thay đổi kích thước mọi thứ cho bạn một cách chính xác)). Bằng cách đó, cùng một hộp thoại sẽ xuất hiện và bạn không nên có ngoại lệ. Các tùy chọn khác sẽ yêu cầu rất nhiều công việc xung quanh onSaveInstanceState và onRestoreInstanceState, và bạn cần phải rất cẩn thận về vấn đề thời gian nếu thread thực sự kết thúc trong thời gian đó. Toàn bộ hoạt động tái tạo trên ý tưởng xoay không hoạt động tốt với đa luồng.

+0

Thực ra, giải pháp tốt nhất cho tôi là nếu có cách nào để đính kèm hộp thoại hiện có vào hoạt động mới được tạo ra, vì nhiệm vụ có thể vẫn đang chạy. Có cách nào làm được việc này không? Cũng cập nhật câu hỏi của tôi để phản ánh điều đó. – PureSpider

+1

Nếu bạn không sử dụng bố cục/hình vẽ riêng cho cảnh quan và dọc, bạn chỉ có thể ghi đè lên configChange trong tệp kê khai của mình cho hoạt động để nó không phá hủy hoạt động (nó vẫn xoay và thay đổi kích thước mọi thứ cho bạn một cách chính xác). Các tùy chọn khác sẽ yêu cầu rất nhiều công việc xung quanh onSaveInstanceState và onRestoreInstanceState, và bạn cần phải rất cẩn thận về vấn đề thời gian nếu thread thực sự kết thúc trong thời gian đó. –

+0

Phương pháp đó được khuyến khích bởi google mặc dù ... tại sao? – PureSpider

0
if (progressDialog != null) { 
    progressDialog.dismiss(); 
} 
+0

Rõ ràng, tiến trìnhDialog không phải là null ngay cả khi tách ra khỏi cửa sổ. Khác tôi sẽ nhận được một NPE, phải không? – PureSpider

+4

có, bạn đã đúng. lỗi của tôi –

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