2011-08-13 7 views
10

Tôi đang tạo ứng dụng dành cho thiết bị di động Android. Tôi có một WeakReference để hoạt động của tôi trong AsyncTask để đảm bảo rằng nó có thể được thu thập rác thải.Weakreference get() phương thức an toàn như thế nào? (Android, asynctask)

Khi onPostExecute() được gọi, tôi

Acitivty activity = mWeakRef.get(); 

Sau đó, tôi sử dụng các đối tượng hoạt động để hiển thị hộp thoại cho người dùng vv vv

Câu hỏi của tôi là, như tôi đang cố gắng để xác định hộp thoại để hiển thị và phải làm gì, đối tượng hoạt động của tôi có thể trở thành null không? Nó có thể trở thành null nếu GC chạy ở giữa dòng thực thi của tôi không? Tôi có an toàn để tiếp tục sử dụng đối tượng đó từ get() đầu tiên hay tôi phải làm lại get() và kiểm tra xem giá trị đó có phải là không ngay trước khi tôi sử dụng nó.

cảm ơn!

Trả lời

9

Thật an toàn!
Ngay sau khi bạn gán kết quả của get() cho một biến, bạn có một tham chiếu mạnh mẽ một lần nữa để chặn bộ sưu tập gargbage cho đối tượng này miễn là tham chiếu mới tồn tại.
Tất nhiên, sau bài tập này, bạn cần kiểm tra xem hoạt động có phải là không.

-1

Tôi nghĩ rằng nó KHÔNG an toàn. Tôi nhận được NPE tại số activity.msgWebView.setVisibility(View.GONE); bên trong Trình xử lý.

`` `java

tin lớp tĩnh HttpStatusHandler kéo dài Handler {

private WeakReference<MessageWebViewActivity> activityWeakReference; 

    public HttpStatusHandler(WeakReference<MessageWebViewActivity> activityWeakReference) { 
     this.activityWeakReference = activityWeakReference; 
    } 

    @Override 
    public void handleMessage(Message msg) { 
     MessageWebViewActivity activity = activityWeakReference.get(); 
     if (activity != null) { 
      if (msg.what == MSG_URL_OK) { 
       activity.loadUrl(activity.url); 
      } else if (msg.what == MSG_URL_ERROR) { 
       activity.msgWebView.setVisibility(View.GONE); 
       activity.clPageError.setVisibility(View.VISIBLE); 
       activity.progressbarLayout.setVisibility(View.GONE); 
      } 

     } 
    } 
} 

` ``