tôi thường giao toàn bộ các sự kiện hoạt động để một lớp điều khiển riêng biệt, trong đó có một phương pháp đặc biệt để xử lý các sự kiện từ Activity
Dừng Handler nhiệm vụ Runnable khi phá hủy hoạt động
@Override
public boolean handleMessage(int what, Object data) {
switch (what) {
case ExerciseViewEvent.STARTUP:
workerHandler.post(new Runnable() {
public void run() {
onStartup();
}
});
return true;
}
này được thực hiện để giữ thread UI đáp ứng và thực hiện tất cả các tính toán trong các tác vụ nền.
Tuy nhiên, khi phương pháp Activity.onDestroy()
được gọi bởi hệ thống, phương pháp controller.dispose()
được gọi, mà dọn dẹp tất cả các nội dung trong bộ điều khiển theo cách này
@Override
protected synchronized void dispose() {
.................
if (model != null) {
synchronized (model) {
model.dispose();
}
model = null;
}
helper = null;
.....................
super.dispose();
}
Như bạn thấy, xử lý điều khiển xảy ra trong thread UI, mà không ủy quyền nó cho một chuỗi xử lý.
Vấn đề xảy ra khi nào, ví dụ, onDestroy
được gọi là ở giữa onStartup()
phương pháp: onDestroy
dọn dẹp các mô hình và tất cả các tài liệu tham khảo khác, nhưng bên trong onStartup
phương pháp nó cố gắng truy cập vào các mô hình tại một số điểm, nhưng coi đó là null
, một ngoại lệ được ném.
Cách tốt nhất để giải quyết vấn đề này là gì? Tôi không muốn khóa tất cả các phương pháp điều khiển bởi vì một số trong số chúng có thể xảy ra đồng thời mà không can thiệp lẫn nhau.
Hơn nữa, có thể phương thức onDestroy không được hệ thống gọi. – Yury
Điểm tốt Yuri, nhưng nếu nó không được gọi, thì tất cả các đối tượng được phân bổ bởi hoạt động này đều bị JVM phá hủy? Vì vậy, tôi không phải lo lắng về nó, phải không? Trong xử lý, tôi chỉ xử lý tất cả các đối tượng, không có gì khác. –