2013-08-07 37 views
15

Giống như:Bạn có nên gọi kết thúc() sau khi bắt đầu Hoạt động mới trong Android không?

startActivity(intent); 
finish(); 

Nếu không gọi finish() explicitly, onDestroy() không được gọi cho các Hoạt động cũ, và tôi chạy ra khỏi bộ nhớ (OutOfMemory Exception).

Vì vậy, nó là một ý tưởng tốt để gọi finish() explicitly to prevent OutOfMemory Exception?

+0

điều gì xảy ra nếu người dùng muốn quay lại hoạt động trước bằng cách nhấp vào nút quay lại? – Raghunandan

+2

Không. Vấn đề của bạn ở đâu đó khác. – fdreger

+0

Bạn đang sử dụng 'Bitmap' (hoặc một bộ sưu tập) ở bất kỳ đâu? Nếu bạn chưa sử dụng [Mat Memory Analyzer Tool] (http://www.eclipse.org/mat/), bây giờ là thời điểm tốt. – haventchecked

Trả lời

1

Việc làm này là nếu bạn không cần một ví dụ về số Activity. Vì vậy, khi bạn bấm trở lại vào Activity tiếp theo biết rằng bạn sẽ không quay trở lại này nhưng bất cứ điều gì là trên ngăn xếp dưới đây mà Activity là hoặc màn hình chủ nếu không có nhiều hơn nữa.

Tuy nhiên, tôi không chắc chắn đây là lý do tại sao bạn nhận được ngoại lệ OOM và có lẽ bạn nên tìm ra nơi từ đó đến từ đó. Nếu bạn đang sử dụng Bitmap thì điều đó có thể gây ra ngoại lệ.

+0

Có, tôi sử dụng Bitmap. Nếu không gọi kết thúc rõ ràng(), GC không gọi onDestroy() của Hoạt động và tài nguyên Bitmap đã tải của Hoạt động chiếm nhiều bộ nhớ, do đó tôi kết thúc outOfMemoryException. Nếu onDestroy() không được GC gọi thì có nghĩa là rò rỉ bộ nhớ không? Nếu không có tham chiếu đến Hoạt động, không nên GC gọi ondestroy() khi cần thêm bộ nhớ? –

0

Không, gọi finish() sau startActivity không tuân thủ nguyên tắc của Android. OutOfMemoryExecption của bạn đang được gây ra bởi một cái gì đó khác

+13

Ở đâu trong hướng dẫn nó nói rằng bạn không nên gọi 'kết thúc()' sau khi gọi 'startActivity'? –

+2

Dường như tôi đã hiểu sai hướng dẫn sau khi đọc nhận xét của bạn bên dưới. Lỗi của tôi. –

25

Khi bạn bắt đầu một hoạt động mới, hoạt động hiện tại được đẩy lên ngăn xếp của tác vụ hiện tại. (Bạn có thể thay đổi hành vi này qua cờ và/hoặc tệp kê khai, nhưng đây là hành vi mặc định.) Khi người dùng nhấn chức năng quay lại, hoạt động hàng đầu được hoàn tất và ngăn xếp được bật lên. Kết quả là người dùng thấy ứng dụng quay trở lại hoạt động trước đó.

Thật tuyệt khi gọi finish() sau khi bắt đầu một hoạt động mới. Kết quả sẽ là hoạt động hiện tại (không còn ở trên cùng của ngăn xếp, vì bạn vừa mới bắt đầu một hoạt động mới) sẽ bị xóa khỏi ngăn xếp. Sau đó, khi người dùng nhấn Back, nó sẽ chuyển đến hoạt động trước đó trên ngăn xếp lại (hoặc thoát khỏi ứng dụng của bạn nếu ngăn xếp trống).

Nếu bạn đang nhảy qua lại giữa các hoạt động A và B bằng cách bắt đầu một hoạt động mới và không bao giờ gọi số finish(), điều này có thể gây ra ngoại lệ OOM khi chồng lấp đầy các phiên bản của từng hoạt động.

Bạn có thể đọc thêm về điều này trong chủ đề hướng dẫn Tasks and Back Stack. Nó cũng mô tả làm thế nào để đối phó một cách chính xác với đi xe đạp giữa các hoạt động.

+0

Câu trả lời hay. Cảm ơn bạn. – stevehs17

+0

Thứ tự của 'startActivity (intent); kết thúc(); 'hai câu này có vấn đề gì cả? –

+1

@WeishiZeng - Tôi đã thực hiện theo cả hai cách và dường như không tạo ra sự khác biệt nào. Tôi không nghĩ nó quan trọng. –

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