2011-12-01 46 views
5

Tôi muốn thực hiện một asynctask sau khi hoàn thành tác vụ đầu tiên. Nhưng khi in trạng thái của nhiệm vụ đầu tiên, nó luôn hiển thị RUNNING.If thực hiện cả hai nhiệm vụ song song chỉ nhiệm vụ nhỏ hơn sẽ được thực hiện. Tôi đang chạy cả hai trong phương pháp oncreate hoạt động.Trạng thái Asynctask luôn hiển thị chạy

đây là mẫu mã của tôi

public class test extends Activity 
{ 

    ExecuteTask1 task1; 
    ExecuteTask2 task2; 
@Override 
public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

      task1 = new ExecuteTask1(); 
      task1.execute(token); 
      System.out.println(task1.getStatus()); 
      if(task1.getStatus() ==AsyncTask.Status.FINISHED) 
      { 
       task2 = new ExecuteTask2(); 
       task2.execute(token); 
      } 

    } 
} 

Trả lời

4

Trong mã của bạn ngay bây giờ, bạn không dành thời gian task1 để kết thúc. Bắt đầu task2 từ phương thức onPostExecute của tác vụ 1. (Bạn sẽ phải sửa đổi mã trong lớp ExecuteTask1 để làm việc này.)

Hoặc, có nhiệm vụ1 gọi lại hoạt động của bạn (hoặc đăng tin nhắn cho nó hoặc cái gì đó) trong onPostExecute để hoạt động của bạn có thể bắt đầu tác vụ2 .

+0

Cảm ơn Ted làm việc tốt. – Reji

+1

Có thể hơi tắt chủ đề nhưng nó có thể là getStatus() trả về Chạy nếu AsyncTask đã bị hủy trước oO không? Ít nhất đó là những gì tôi đang nhận được ngay bây giờ, mặc dù đã hủy bỏ AsyncTask của tôi (trừ khi cùng một nhiệm vụ bằng cách nào đó được tự động hồi sinh xD). – AgentKnopf

+0

@Zainodis - 'AsyncTask.getStatus()' thực sự có thể trả về 'RUNNING' sau khi' cancel() 'được gọi và trả về' true'. Lệnh gọi 'cancel()' có thể, ví dụ, gọi 'interrupt()' trên chuỗi cơ bản hoặc có thể chỉ cần đặt cờ 'isCancelled()' cho 'AsyncTask', nhưng trạng thái của 'AsyncTask' won' t thay đổi cho đến khi chuỗi bên dưới thông báo ngắt hoặc thay đổi giá trị cờ và thực sự thoát. Đó là lý do tại sao các tài liệu khuyến cáo rằng 'doInBackground()' nên định kỳ kiểm tra giá trị của 'isCancelled()' và "hoàn thành nhiệm vụ càng sớm càng tốt." –

1

Đó là vì bạn nhận được trạng thái task1 ngay sau khi bạn khởi động - bạn cần gọi số AsyncTask thứ hai từ số onPostExecute() đầu tiên, sử dụng handler hoặc một số cách khác.

+0

Cảm ơn Vladimir đã làm việc tốt – Reji

+2

Vì onPostExecute chạy trên chuỗi sự kiện, không cần sử dụng trình xử lý. –

0

Phương pháp nhận AsyncTask đang chặn. Sau đó, bạn cũng có thể viết task1.get() và sau đó task2.execute(). Như vậy, bạn loại bỏ sự phụ thuộc của task1 với task2 trong việc thực hiện AsyncTask

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