2011-02-10 31 views
6

Tôi có một hoạt động có thể có chuỗi chạy khi người dùng nhấn trở lại và kết thúc() thực hiện hoạt động. Điều gì sẽ xảy ra với những chủ đề đó vào thời điểm đó? Tất cả họ sẽ cố gắng hoàn thành trừ khi tôi ngắt chúng trong onDestroy()?Điều gì xảy ra với chủ đề và lượt xem của một hoạt động khi nó bị phá hủy?

Ví dụ: mã bên dưới có an toàn không, vì chế độ xem và con trỏ của tôi có thể bị hủy nếu hoạt động kết thúc trước chuỗi?

Lý do tôi hỏi là thỉnh thoảng tôi gặp sự cố khi hoàn tất các hoạt động mà tôi chưa gỡ lỗi thành công, vì chúng hiếm khi xảy ra và không bao giờ trong chế độ gỡ lỗi. Tôi đã bắt đầu kiểm tra nếu đối tượng xem của tôi là null trước khi làm bất cứ điều gì cho họ trong runOnUIThread(). Không chắc đó có phải là giải pháp sạch nhất hay không, hoặc nếu đó là vấn đề.

new Thread()(
public void run(){ 
    crunchOnSomethingForAwhile(mCursor); 
    MyActivity.this.runOnUIThread(new Runnable(){ 
     public void run(){ 
      mTextView.setText("thread complete"); 
      mCursor.close(); 
     } 
    } 
} 
).start(); 
+0

LogCat nói gì khi các sự cố này xảy ra? – alexanderblom

+0

Chúng chỉ xảy ra khi tôi rời khỏi máy tính của mình, vì vậy tôi không được kết nối với LogCat. Có lẽ tôi đang thiếu một cái gì đó thực sự cơ bản, nhưng khi tôi cố gắng để đăng nhập của tôi sau này trong giao diện điều khiển Windows, tôi chỉ nhận được vài trang cuối cùng giá trị của các bản ghi trong cửa sổ giao diện điều khiển - Tôi đoán nó chạy ra khỏi phòng. Cần phải tìm ra cách để đổ tập tin như một tập tin vào máy tính của tôi. – Tenfour04

Trả lời

1

Ai đó đã đăng câu trả lời trên một chuỗi khác mà onDestroy đặt tất cả tham chiếu chế độ xem thành null và cuối cùng là tham chiếu hoạt động thành giá trị rỗng. Vì vậy, tôi sẽ giả định rằng thực hành tốt nhất là làm gián đoạn tất cả các luồng đang chạy trong onDestroy, hoặc ít nhất là bắt NullPointerExceptions trong bất kỳ phương thức runInUIThread nào.

1

Tôi sẽ xem xét sử dụng AsyncTask thay vì đơn giản Thread. Nó có một số hỗ trợ được xây dựng để làm công việc trong một chủ đề khác, và sau đó khi hoàn thành làm một cái gì đó trên thread UI.

Điều đó nói rằng, có một số chủ đề xung quanh cuộc trò chuyện đó về cách xử lý AsyncTask giây khi hoạt động kết thúc. Chính xác những gì bạn nên làm phụ thuộc vào những gì công việc đang làm. Nếu nó chỉ áp dụng cho Hoạt động đó, thì bạn chỉ có thể hủy tác vụ trong onPause (giả sử nó không chỉ là thay đổi xoay vòng).

Nếu không, có nhiều chiến thuật khác nhau để giữ cho AsyncTask trên các Hoạt động. Xem question để biết một số ý tưởng. Điều này commonsware blog cũng có một ví dụ về tổ chức vào một AsyncTask trên một xoay màn hình.

+0

Cảm ơn thông tin. Tôi là loại khóa vào chủ đề thay vì asynctasks, bởi vì tôi đang sử dụng Facebook SDK, được viết với chủ yếu là chủ đề, và không muốn viết lại một bó của nó nếu tôi có thể tránh nó. Không phải là một vấn đề lớn, nhưng tôi chưa thấy bất kỳ lợi ích nào để chuyển đổi nó. Bất kể, có vẻ như kết quả trên UIThread sẽ giống nhau. Thao tác chế độ xem trong hoạt động bị hủy không an toàn? – Tenfour04

+0

Tôi đã không thực sự thử nó, nhưng có vẻ như rất có thể là cố gắng để thao tác một cái nhìn trong một hoạt động bị phá hủy sẽ có hậu quả ngoài ý muốn. –

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