2014-10-17 27 views
6

Tôi có một số ActivityA, có Nút. Khi nhấp vào button, nó sẽ mở ra một ActivityB khác.Android: Nhấn nút quay lại trong khi AsyncTask đang chạy

onCreate() phương thức ActivityB, Tôi bắt đầu AsyncTask kết nối với máy chủ và tìm nạp kết quả và hiển thị kết quả đó trên màn hình.

Đây là Bộ luật của Activity B:

public class ActivityB extends Activity { 
    AsyncFetch asyncFetch; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(null != savedInstanceState) { 
      return; 
     } 
     asyncFetch = new AsyncFetch(); 
     asyncFetch.execute(); 
    } 
} 


private class AsyncFetch extends AsyncTask<Object, Void, Object> { 
    @Override 
    protected void onPostExecute(Object o) { 

    } 

    @Override 
    protected Object doInBackground(Object... params) { 
     //contacts the http server. 
    } 
} 

Trong khi thực hiện AsyncFetch, khi tôi đánh lại báo chí, các ActivityB là không nhận được tiêu huỷ ngay. Nhưng bị phá hủy sau khi hoàn thành AsyncTask.

Làm cách nào để triển khai tính năng này để tránh báo chí bị đóng băng? Tôi đã thử bên dưới:

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

Nhưng vẫn đợi số AsyncTask để hủy hoặc hoàn tất.

Giống như ứng dụng GMail, khi tôi mở một cái gì đó. Trong khi trong quá trình nếu tôi nhấn nút quay lại, nó chỉ đi ra rằng Activity.

Có cách nào khác để triển khai quy trình nền không? Bất kỳ design pattern để thực hiện điều này? Làm ơn cho tôi biết.

Mọi trợ giúp đều được đánh giá cao.

+0

bạn sẽ cần phản hồi đó từ máy chủ ngay cả khi đã nhấn phím backkey ?? – Elltz

+0

AsyncTasks không chặn chuỗi giao diện người dùng nếu được triển khai chính xác. Đăng toàn bộ mã của bạn. – biegleux

+0

Giao diện người dùng không bị chặn. nhưng Activity không bị phá hủy cho đến khi hoàn thành async. – User12111111

Trả lời

2

Hãy thử điều này:

@Override 
public void onBackPressed() { 
    asyncFetch.cancel(true); 
    // If you want to finish the activity you can use below code 
    // finish(); 
} 
+0

Có, tôi đã cố gắng giống như vậy nhưng vẫn còn hành vi giống nhau. – User12111111

4

Chỉ cần xử lý cho mình phương pháp onBackPressed():

@Override 
public void onBackPressed() 
{ 
    if (asyncFetch != null) 
     asyncFetch.cancel(true); 

    super.onBackPressed(); 
} 
+0

Có, tôi đã thử nhưng vẫn cư xử giống nhau – User12111111

0

Ở đây chúng tôi đi. Thử cái này.

@Override 
public void onBackPressed() { 
    if (asyncFetch.getStatus() == AsyncTask.Status.RUNNING) { 
     asyncFetch.cancel(true); 
    } 
    finish(); 
} 
+1

là u chắc chắn u đã cố gắng giống nhau mà không có super.onBackPressed(); khi bắt đầu? –

+0

Tôi đã thử như cũ, nhưng tôi vẫn thấy vấn đề. FYI, những gì tôi đang làm trong AsyncTast là giao tiếp HTTP. Tôi đang kết nối với máy chủ thông qua HTTPClient. Trong khi trong quá trình http, báo chí lại chỉ cần chờ đợi trên phương thức finish() cho đến khi nhiệm vụ async được đóng lại. – User12111111

3

Từ các nhà phát triển Android của website:

hủy một nhiệm vụ

Một nhiệm vụ có thể bị hủy bỏ bất cứ lúc nào bằng cách gọi hủy (boolean). Gọi phương thức này sẽ gây ra các cuộc gọi tiếp theo tới isCancelled() để trả về true. Sau khi gọi phương thức này, onCancelled (Object), thay vì onPostExecute (Object) sẽ được gọi sau khi doInBackground (Object []) trả về. Để đảm bảo rằng tác vụ bị hủy càng nhanh càng tốt, bạn nên luôn kiểm tra giá trị trả về của isCancelled() định kỳ từ doInBackground (Object []), nếu có thể (trong vòng lặp chẳng hạn.)

Vì vậy, ngắn, bạn có thể đánh dấu AsyncTask là bị hủy trong onPause() hoặc onBackPressed() từ Activity và sau đó bạn có thể thêm một số nếu các khối trong doInBackground() và quay lại ngay lập tức nếu tác vụ bị hủy.

Ví dụ:

@Override 
protected void doInBackground(Object... params){ 

    // do some work 

    if(isCancelled()){ 
     // end task right away 
     return null; 
    } 
    // if task is not cancelled yet, 
    // do some other work 
} 

Tuy nhiên, nếu các hoạt động mạng đã bắt đầu, bạn sẽ cần phải hủy bỏ nó từ HttpClient của bạn.

-1

Khi bạn click mặt sau button, trước tiên nó sẽ được gọi là onBackPressed(), do đó, trong phần này, hãy hủy asynctask.

@Override 
public void onBackPressed() { 
    if (asyncFetch != null && asyncFetch.getStatus() == AsyncTask.Status.RUNNING){ 
     asyncFetch.cancel(true); 
    } 
} 
+0

Có, tôi đã cố gắng nhưng vẫn cư xử giống nhau. – User12111111

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