Hoạt động của tôi đang cố gắng tạo AlertDialog yêu cầu Ngữ cảnh làm tham số. Điều này hoạt động như mong đợi nếu tôi sử dụng:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
Tuy nhiên, tôi không hài lòng khi sử dụng "cái này" làm bối cảnh do khả năng rò rỉ bộ nhớ khi Activity bị phá hủy và được tạo lại ngay cả trong một thứ đơn giản như xoay màn hình. Từ một bài đăng liên quan trên blog của nhà phát triển Android :
Có hai cách dễ dàng để tránh rò rỉ bộ nhớ liên quan đến ngữ cảnh. Rõ ràng nhất là tránh thoát khỏi bối cảnh bên ngoài phạm vi của chính nó. Ví dụ trên cho thấy trường hợp của một tham chiếu tĩnh nhưng các lớp bên trong và tham chiếu ngầm của chúng đối với lớp bên ngoài có thể nguy hiểm như nhau. Giải pháp thứ hai là sử dụng bối cảnh Ứng dụng. Bối cảnh này sẽ tồn tại miễn là ứng dụng của bạn còn sống và không phụ thuộc vào vòng đời hoạt động. Nếu bạn có kế hoạch giữ các đối tượng tồn tại lâu cần bối cảnh, hãy nhớ đối tượng ứng dụng. Bạn có thể lấy nó dễ dàng bằng cách gọi Context.getApplicationContext () hoặc Activity.getApplication ().
Nhưng đối với AlertDialog()
cả hai getApplicationContext()
hoặc không getApplication()
được chấp nhận như là một bối cảnh, vì nó ném ngoại lệ:
"Không thể thêm cửa sổ - mã thông báo null không dành cho ứng dụng.
mỗi tài liệu tham khảo: 1 , 2 , 3 , v.v.
Vì vậy, điều này có thực sự được coi là một "lỗi" không, vì chúng tôi chính thức được khuyên nên sử dụng Activity.getApplication()
và nó không hoạt động như quảng cáo?
Jim