2012-06-25 32 views
15

Tôi đã sử dụng AsyncTasks cùng với đơn đăng ký của mình, để tải xuống và cập nhật giao diện người dùng một cách lười biếng.Android AsyncTasks Cách kiểm tra Nếu hoạt động vẫn đang chạy

Còn bây giờ AsyncTasks tôi cập nhật giao diện người dùng thực đơn giản:

protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     gender.setText(values[0]); 
} 

Vấn đề của tôi là làm thế nào để kiểm tra xem các hoạt động mà giới TextView render từ, vẫn còn có sẵn?

Nếu không, tôi sẽ gặp lỗi và ứng dụng của tôi sẽ tắt.

+0

không chắc chắn có thể thử với nếu (null == giới && gender.isShown()) –

Trả lời

25

Bạn có thể hủy AsyncTask của bạn trong onDestroy của hoạt động

@Override 
protected void onDestroy() { 
    asynctask.cancel(true); 
    super.onDestroy(); 
} 

và khi thực hiện thay đổi mà bạn kiểm tra xem AsyncTask của bạn đã bị hủy (hoạt động phá hủy) hoặc không

protected void onProgressUpdate(String... values) { 
    super.onProgressUpdate(values); 
    if(!isCancelled()) { 
     gender.setText(values[0]); 
    } 
} 
+0

Rất đẹp. Nhưng không có guranttee rằng ondestroy sẽ được gọi là mọi lúc. (Đối với liên kết tham chiếu bên dưới). Làm thế nào để bạn đối phó với điều đó? https://stackoverflow.com/a/4449988/3265444 – Ajji

0

nên không

if (gender) { 
    gender.setText(values[0]); 
} 

là đủ?

+0

được bạn dành cho (null == giới)? ngay cả đối với điều đó, không chỉ là không đủ thời gian –

+1

Không, đó là chưa đủ. Hoạt động có thể kết thúc nhưng giới tính vẫn có thể không phải là không và cố gắng tham chiếu nó sẽ không thành công vì Chế độ xem/Cửa sổ không còn hoạt động nữa. – AgileYogi

1

Mặc dù, tôi chưa bao giờ gặp phải trường hợp này; Tôi sẽ cố gắng trả lời câu hỏi của bạn.

Trong trường hợp của bạn, bạn cần phải xác thực Context được chuyển đến AsyncTask.

Bạn có thể thực hiện xác nhận

if(null!=mContext) //Activity still exist!! 
{ 
    gender.setText(values[0]); 
} 
else //Activity is destroyed 
{ 
    //Take appropriate action!! 
} 

Ưu điểm sẽ được, nếu hoạt động này bị phá hủy bởi thời gian bạn đạt tuyên bố này, Context của bạn sẽ tự động trở thành null và bạn có thể xử lý kịch bản.

+2

Điều này sẽ không hoạt động. Bởi vì bạn giữ tham chiếu cứng đến hoạt động, nó sẽ không bị vô hiệu. Nó sẽ trở thành không hợp lệ, nhưng nhiệm vụ không đồng bộ sẽ tiếp tục giữ tham chiếu đến hoạt động. – uthark

1

tôi sẽ nhấn mạnh rằng bạn nếu bạn không hoạt động thì tại sao bạn không hủy AsyncTask? Đó sẽ là giải pháp tốt hơn và khả thi hơn. Nếu ứng dụng của bạn đang chạy nói rằng bạn di chuyển từ một Activity sang một Activity khác thì nó sẽ không đưa ra lỗi AFAIK.

Nhưng, tôi sẽ nhấn mạnh đến hủy AsyncTask sau đó Hoạt động you'r không chạy, bạn có thể kiểm tra AsyncTask đang chạy hay không,

if(task != null && task.equals(AsyncTask.Status.RUNNING)) 
task.cancel(true); 
2

Hãy thử

if (!isFinishing()) { 
    gender.setText(values[0]); 
} 
5

Tôi đã có một tương tự vấn đề - về cơ bản tôi đã nhận được một NPE trong một nhiệm vụ không đồng bộ sau khi người dùng đã phá hủy mảnh. Sau khi nghiên cứu vấn đề trên Stack Overflow, tôi đã áp dụng giải pháp sau:

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


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

    running=false; 
    ... 
} 

Sau đó, tôi kiểm tra "nếu chạy" định kỳ trong mã không đồng bộ của tôi. Tôi đã căng thẳng thử nghiệm điều này và bây giờ tôi không thể "phá vỡ" hoạt động của tôi. Điều này hoạt động hoàn hảo và có lợi thế là đơn giản hơn một số giải pháp mà tôi đã thấy trên SO.

+0

THANK YOU SO MUCH !!! CUỐI CÙNG TÔI CŨNG NHẬN ĐƯỢC VIỆC LÀM!!! – sshashank124

+1

Điều này rất đơn giản và thực sự có ý nghĩa :) Nếu có ai đó nghĩ về từ khóa 'volatile' đó, hãy đọc: http://stackoverflow.com/a/107040/4331787 –

1

Như this một phần của một huấn luyện về Android Developers gợi ý, giữ một WeakReference trên các yếu tố giao diện người dùng mà cần phải được cập nhật sau khi nhiệm vụ được thực hiện và kiểm tra xem tài liệu tham khảo là null trước khi sử dụng nó. Điều này giúp không chỉ trong việc kiểm tra xem giao diện người dùng vẫn còn xung quanh, nhưng cũng không ngăn chặn các yếu tố giao diện người dùng khỏi bị thu gom rác.

1

Kiểm tra xem hoạt động đang chạy hay không

if (!isFinishing()) { 
    // Do whatever you want to do 
} 
Các vấn đề liên quan