2012-08-28 118 views
28

我正在使用Android SDK 4.0.3 API15,我想並行運行多個AsyncTasks。我從Web服務器獲取數據並實時動畫(10 fps)。但根據用戶操作,我需要將一些數據發送到Web服務器。當發生這種情況時,我的動畫會暫停一段時間(發送數據進入隊列並且讓數據等待它完成),因此我無法捕捉到實時數據。並行執行多個AsyncTask

這個answer是相當的解釋,但我不能使它的工作。所以任何幫助將非常感激。

我想我需要使用此功能來實現這一目標:

AsyncTask.executeOnExecutor(Executor exec, Params... params) 

但我不能通過遺囑執行人作爲參數,我不能實例化一個執行者。這是我的AsyncTask類:

public class GetPlayers extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... urls) { 

     Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 

     rawData=""; 
     for (String url : urls) { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); 
       if((rawData = buffer.readLine()) == null){ 
        rawData = "error"; 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return rawData; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     manipulate(); 
    } 
} 

我執行它是這樣的:

GetPlayers task = new GetPlayers(); 
requestString = "web adress is here..."; 
task.execute(new String[] { requestString }); 
+0

你是什麼意思?'不'作爲參數傳遞執行者,我不能實例化執行者。'?你有沒有檢查過developer.android.com/reference/java/util/concurrent/Executor.html,http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html?你正在嘗試使用哪一個確切的執行器? – sandrstar

+0

其實我對Executors沒有太多經驗。所以我試圖實例化Executor類。據我所知,從鏈接我需要使用ThreadPoolExecutor。我會尋找它。謝謝。 – Srht

+0

對,Executor只是一個接口,不能被實例化。您可以查看Executor文檔的「已知間接子類」部分,以獲取執行者。但是,典型的似乎是ThreadPoolExecutor。 – sandrstar

回答

55

這是我該怎麼辦:

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

其中MyAsyncTask是正規的AsyncTask子類。或者,你可以用這一切的輔助類:

class TaskHelper { 

    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); 
     } 
    } 
} 

,然後就去做:

TaskHelper.execute(new MyTask()); 

TaskHelper.execute(new MyTask(), args); 

TaskHelper.execute(new MyTask(constructorParams), args); 
+0

我該如何通過我的論點。喜歡這個?新的MyAsyncTask()。executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,new String [] {requestString}); – Srht

+0

請始終從SDK文檔開始。不完美,但它是有用的..在'executeOnExecutor()':http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor%28java.util.concurrent.Executor,%20Params。 ..%29所以你可以傳遞你的參數 –

+0

我已經看過,並在提問之前閱讀過,但我不知道如何使用它。我試圖將「executeOnExecutor(Executor exec,Params ... params)'添加到我的類定義中,並且只要您猜測它不起作用。我是一個新手,但試圖讓自己完成任務。在這種情況下,我只是不知道(也找不到)正確使用它:'new MyAsyncTask()。executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);'所以非常感謝你的這個信息,它像奇蹟一樣工作。請不要感到沮喪:) – Srht

0

這個問題發生在我,當在AndroidStudio中更新我的應用時到 sdk 25從Intelliy使用Android 2.3 只需稍作更改(executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,string1,...); )完美地工作。 我有一個AsyncTask運行在一個服務下載和 創建AsyncTasks上傳沒有服務。