2012-10-12 30 views
6

Tôi có nên đặt lệnh trước hoặc sau super.onDestroy() khi ghi đè ondestroy của hoạt động không?Người mới bắt đầu Android: onDestroy

protected void onDestroy() { 

    //option 1: callback before or ... 

    super.onDestroy(); 

    //option 2: callback after super.onDestroy(); 
} 

(Bây giờ tôi sợ: Nếu super.onDestroy là quá nhanh, nó sẽ không bao giờ đến trong tùy chọn 2.)

+0

tôi không thấy điều gì có thể ngăn bạn tiếp cận 2 – njzk2

+0

Câu hỏi này là một sự lừa đảo của http://stackoverflow.com/q/18821481/53974 và câu hỏi đó thực sự có câu trả lời được nghiên cứu kỹ lưỡng. http://stackoverflow.com/a/18874519/53974 – Blaisorblade

Trả lời

3

Đây là những gì sẽ xảy ra khi bạn gọi super.onDestroy();

Android Source

protected void onDestroy() { 
    mCalled = true; 

    // dismiss any dialogs we are managing. 
    if (mManagedDialogs != null) { 

     final int numDialogs = mManagedDialogs.size(); 
     for (int i = 0; i < numDialogs; i++) { 
      final Dialog dialog = mManagedDialogs.valueAt(i); 
      if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 
     } 
    } 

    // also dismiss search dialog if showing 
    // TODO more generic than just this manager 
    SearchManager searchManager = 
     (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    searchManager.stopSearch(); 

    // close any cursors we are managing. 
    int numCursors = mManagedCursors.size(); 
    for (int i = 0; i < numCursors; i++) { 
     ManagedCursor c = mManagedCursors.get(i); 
     if (c != null) { 
      c.mCursor.close(); 
     } 
    } 
} 

Về cơ bản điều này có nghĩa rằng nó không quan trọng nếu bạn gọi nó là trước hoặc sau khi mã của bạn.

+0

cũng có nghĩa là tôi không cần gọi "dismiss()" cho onDestroy của hoạt động? tôi nghĩ rằng tôi nhớ rằng có những bản ghi rò rỉ chúng, phải không? trong trường hợp nào xảy ra rò rỉ? –

+1

Loại bỏ chỉ dành cho Hộp thoại và không liên quan đến câu hỏi này vì Hộp thoại có vòng đời khác với hoạt động. Nếu bạn gặp sự cố đối thoại, bạn nên bắt đầu một câu hỏi mới để vấn đề của bạn có thể được giải quyết tốt hơn. –

+0

nhưng nó liên quan đến nó, vì nó hỏi về nơi đặt lệnh vào nó, và bạn đã hiển thị mã của nó. mã dường như đã loại bỏ cơ chế hộp thoại –

7

Bất cứ điều gì mà có thể liên quan đến việc sử dụng các nguồn lực hoạt động nên trước khi cuộc gọi đến super.onDestroy() . Các mã sau khi nó sẽ b đạt, nhưng có thể gây ra vấn đề nếu nó cần những nguồn lực.

+0

tại sao sách hướng dẫn dành cho nhà phát triển Android không đề xuất điều này ở bất cứ đâu :-(tôi đã tìm kiếm tài liệu cho giờ ... – ledy

0

Điều đó tùy thuộc. Nếu bạn muốn các hành động của bạn được áp dụng sau hàm super, bạn nên đặt chức năng của mình sau siêu. Tôi đoán bạn phải hiểu cách sử dụng của super trước tiên. Ví dụ, hãy nhìn vào this question

3

Nơi mã của bạn sau khi super.onDestroy(); ví dụ:

protected void onDestroy() { 
    super.onDestroy(); 

    // Put code here. 

} 

Mã của bạn sẽ kết thúc thực hiện khi trọng phương pháp này.

+1

tôi sẽ gọi testActivity.Instance.InfoThatIAmComingBackToTheMainActivityNow() – ledy

0

Nó sẽ đến trong tùy chọn 2. onDestroy() không thực sự phá hủy đối tượng. Ví dụ của bạn vẫn còn sống sau khi onDestroy() của lớp cha chạy và trả về.

Edit: đây là những gì onDestroy không theo thứ tự:

  • Loại bỏ bất kỳ hộp thoại hoạt động được quản lý.
  • Đóng mọi con trỏ mà hoạt động đang quản lý.
  • Đóng tất cả tìm kiếm mở hộp thoại
+0

tức là nếu thiết bị đủ nhanh, một tham chiếu hoặc con trỏ có thể biến mất ngay cả trước khi nó đến với tùy chọn 2? – ledy

1

Calling super.onDestroy sẽ không làm gián đoạn gọi chủ đề hoặc một cái gì đó như thế này. Mã của bạn sẽ được thực hiện bất kể bạn đặt nó ở đâu, trước hoặc sau super.onDestroy.

super.onDestroy sẽ tài nguyên chỉ miễn phí mà có thể được tham chiếu cho hoạt động này bởi khung (ví dụ như các hộp thoại hệ thống và con trỏ quản lý)

tôi đề nghị bạn kiểm tra liên kết này để biết thêm chi tiết

http://developer.android.com/reference/android/app/Activity.html#onDestroy()

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