2013-08-21 44 views
14

Tôi có hai hoạt động trong đơn đăng ký của mình. Trong Hoạt động A của tôi, tôi đang sử dụng một AsyncTask và Hoạt động thứ hai B cũng sử dụng một AsyncTask khác. Trong Hoạt động A của tôi, tôi đã tải lên một số dữ liệu cho máy chủ và trong Hoạt động B của tôi, tôi đang cố tải xuống một số dữ liệu khác từ máy chủ. Cả hai đều đang chạy trong AsyncTask. Vấn đề của tôi là khi tôi cố tải xuống dữ liệu từ máy chủ trong phương thức Activity B onPreExecute() đã được gọi nhưng phương thức doInBackground() không được gọi là đang đợi hành động đầu tiên của Hoạt động A doInBackground() kết thúc. Tại sao nó xảy ra? Là nó có thể chạy nhiều hơn một hành động nền tại một thời ..Có thể chạy nhiều AsyncTask cùng một lúc không?

Trong Hoạt động Một

ImageButton submit_button = (ImageButton) findViewById(R.id.submit_button); 

submit_button.setOnClickListener(new OnClickListener() 
    { 
     public void onClick(View record_button) 
     { 
         new Save_data().execute(); 
     } 
     }); 
class Save_data extends AsyncTask<String, Integer, Integer> 
{ 
    protected void onPreExecute() 
    { 

} 
    protected Integer doInBackground(String... arg0) 
{ 
    //uploading data here 
    } 

} 

Trong Hoạt động B của tôi

ImageButton get_button = (ImageButton) findViewById(R.id.get_button); 
    get_button.setOnClickListener(new OnClickListener() 
     { 
      public void onClick(View record_button) 
      { 
          new download_process().execute(); 
      } 
      }); 
    class download_process extends AsyncTask<String, integer, integer> 
    { 
     protected void onPreExecute() 
     { 
     Log.e("pre-execute","has been called");//This Log works well 
    } 
     protected Integer doInBackground(String... arg0) 
    { 
     //downloading data here 
     } 
    } 
+0

làm thế nào để sử dụng thi hành di chúc .. xin vui lòng cho tôi biết .. – Amsheer

+1

thể trùng lặp của - (http://stackoverflow.com/questions/ [Chạy nhiều AsyncTasks cùng lúc không thể?] 406 8984/chạy-nhiều-asynctasks-at-the-cùng-thời gian-không-có thể) - cung cấp một lời giải thích thực sự tốt –

Trả lời

25

sử dụng thi hành di chúc như sau

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    new Save_data().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, location); 
} else { 
    new Save_data().execute(location); 
} 

Xem this

+0

Vị trí ở đây là gì? – Amsheer

+0

áp dụng nó, nơi bạn gọi thực hiện() –

+0

nhờ nó làm việc .... – Amsheer

15

Có, nhưng vì Honeycomb, có sự thay đổi theo cách thức AsyncTask được xử lý trên Android. Từ HC + chúng được thực hiện tuần tự, thay vì bị bắn song song, như trước đây. Giải pháp là để gọi cho họ như thế này (đặt nó trong công cụ đẳng cấp riêng biệt hoặc lâu hơn):

public class AsyncTaskTools { 
    public static <P, T extends AsyncTask<P, ?, ?>> void execute(T task) { 
     execute(task, (P[]) null); 
    } 

    @SuppressLint("NewApi") 
    public static <P, T extends AsyncTask<P, ?, ?>> void execute(T task, P... params) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
     } else { 
      task.execute(params); 
     } 
    } 
} 

và sau đó bạn chỉ có thể gọi:

AsyncTaskTools.execute(new MyAsyncTask()); 

hoặc với params (tuy nhiên tôi đề nghị thay vì params passign qua nhiệm vụ xây dựng):

AsyncTaskTools.execute(new MyAsyncTask(), <your params here>); 
+0

Tôi nhận được thông báo này "Phương thức executeAsyncTask (T, P []) không được xác định cho loại AsyncTasktools "Tại sao? – Amsheer

+0

Đã sửa lỗi. Nhưng đó là lỗi khá cơ bản, tại sao bạn không cố gắng tự sửa mình? :) –

+0

Các lớp bên trong không thể có khai báo tĩnh! –

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