Đây là một câu hỏi rất hay, cần có thời gian là một Lập trình viên Android để hiểu hết vấn đề. Thật vậy AsyncTask có hai vấn đề chính có liên quan:
- Chúng liên kết kém với vòng đời hoạt động
- Chúng tạo ra các rò rỉ bộ nhớ rất dễ dàng.
Bên trong ứng dụng RoboSpice Motivations ( có sẵn trên Google Play ), chúng tôi trả lời câu hỏi đó một cách chi tiết. Nó sẽ cung cấp cho bạn một cái nhìn chuyên sâu về AsyncTasks, Loaders, các tính năng và nhược điểm của chúng và cũng giới thiệu cho bạn một giải pháp thay thế cho các yêu cầu mạng: RoboSpice. Yêu cầu mạng là một yêu cầu phổ biến trong Android và về bản chất là các hoạt động chạy lâu dài. Đây là một đoạn trích từ ứng dụng:
Vòng đời của AsyncTask và Activity
AsyncTasks không tuân theo vòng đời của phiên bản Activity. Nếu bạn khởi động AsyncTask bên trong Hoạt động và bạn xoay thiết bị, Hoạt động sẽ bị hủy và một phiên bản mới sẽ được tạo. Nhưng AsyncTask sẽ không chết. Nó sẽ tiếp tục sống cho đến khi hoàn thành.
Và khi hoàn tất, AsyncTask sẽ không cập nhật giao diện người dùng của Hoạt động mới. Thật vậy, nó cập nhật phiên bản cũ của hoạt động không được hiển thị nữa. Điều này có thể dẫn đến Ngoại lệ của kiểu java.lang.
Sự cố rò rỉ bộ nhớ
Rất thuận tiện để tạo AsyncTasks làm lớp bên trong Hoạt động của bạn. Vì AsyncTask sẽ cần thao tác các khung nhìn của Activity khi nhiệm vụ đã hoàn thành hoặc đang thực hiện, việc sử dụng lớp bên trong của Activity có vẻ thuận tiện: các lớp bên trong có thể truy cập trực tiếp vào bất kỳ trường nào của lớp bên ngoài.
Tuy nhiên, nó có nghĩa là lớp bên trong sẽ giữ một tham chiếu vô hình trên cá thể lớp bên ngoài của nó: Activity.
Về lâu dài, điều này dẫn đến rò rỉ bộ nhớ: nếu AsyncTask tồn tại lâu, nó sẽ giữ cho hoạt động "tồn tại" trong khi Android muốn loại bỏ nó vì nó không thể hiển thị được nữa. Hoạt động không thể được thu thập rác và đó là cơ chế trung tâm để Android bảo tồn tài nguyên trên thiết bị.
Thực sự là một ý tưởng rất tồi khi sử dụng AsyncTasks cho các hoạt động chạy dài. Tuy nhiên, chúng phù hợp với những hoạt động ngắn hạn như cập nhật Chế độ xem sau 1 hoặc 2 giây.
Tôi khuyến khích bạn tải xuống ứng dụng RoboSpice Motivations , ứng dụng này thực sự giải thích chuyên sâu về vấn đề này và cung cấp các mẫu và minh họa về các cách khác nhau để thực hiện một số hoạt động nền.
doInBackground
chức năng hoạt động lâu dài sẽ đóng băng màn hình nếu thanh tiến trình không được sử dụng.