2014-04-16 233 views
1

我想在一個循環中調用一個異步任務並且並行執行幾次。在循環中調用異步任務?

我有一個項目列表,我分成了更小的列表,每個列表中有10個項目。 然後,對於每個小型列表,我使用THREAD_POOL_EXECUTOR執行異步任務。

問題是,它不工作。我在想它,因爲每次傳遞給AsyncTask時都使用相同的列表 - 我認爲它可能作爲參考傳遞。

我是否需要以某種方式動態創建新列表?

//split the ListItems into 10s 
     if (actualThumbs.size() > 10){ 

     List<List<ListItem>> parts = chopped(actualThumbs, 10); // this splits it into parts of 10 
     List<ListItem> listToSend = new ArrayList<ListItem>(); //this is the list to pass 
    for(int i = 0; i < parts.size(); i++){ //for every part 


     for(int x = 0; x < parts.get(i).size(); x++){ //for everything in that part 
      //add to its own List 
      listToSend.add(parts.get(i).get(x)); 

     } 
     //this is the async task 
     loadActualThumbs thumbs = new loadActualThumbs(); 
     //execute multiple threads 
     thumbs.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,listToSend); 
     listToSend.clear(); //clearing the list ready for a new one - PROBLEM? 
    } 
    } 
    else 
    { 
     //else just execute AsyncTask normally, this works OK 
     loadActualThumbs thumbs = new loadActualThumbs(); 
     thumbs.execute(actualThumbs); 
    } 

編輯:
我試圖改變我的代碼,而不是通過列出的清單中添加,我想發送到異步任務到另一個任務列表中的每個列表,然後循環和發送的每一個:

if (actualThumbs.size() > 10){ 

       List<List<ListItem>> parts = chopped(actualThumbs, 10); 
       List<ListItem> listToSend = new ArrayList<ListItem>(); 
       List<List<ListItem>> sendMe = new ArrayList<List<ListItem>>(); 
      for(int i = 0; i < parts.size(); i++){ //for every part 


       for(int x = 0; x < parts.get(i).size(); x++){ //for everything in that part 
        //add to its own ListItem? 
        listToSend.add(parts.get(i).get(x)); 

       } 

       sendMe.add(listToSend);// add the List to this List 
       listToSend.clear(); 
      } 

       for(int e = 0; e<sendMe.size();e++){ //loop through the list of lists 

        loadActualThumbs thumbs = new loadActualThumbs(); 
        //execute multiple threads? 
        thumbs.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,sendMe.get(e)); // execute async with correct List 
       } 

      } 

      else 
      { 
       if (actualThumbs.size() > 0){ 
       //load actual thumbnails 
       loadActualThumbs thumbs = new loadActualThumbs(); 
       thumbs.execute(actualThumbs); 
       } 

      } 
+0

thumbs.executeOnE xecutor(AsyncTask.THREAD_POOL_EXECUTOR,parts.get(i)); – ElDuderino

+0

非常聰明!它的驚人之處在於我們如何能夠想到事物它似乎現在工作,雖然我不知道爲什麼它不是以我的方式工作。請回復,以便我可以標記爲答案! – user3437721

+0

另外 - 因爲我的代碼將BIG列表分成多個部分(各10個)。如果大列表包含150個項目,則會有15個部分,因此會有15個異步任務。我是否正確地閱讀他們將排隊,並且一次只能運行5個? – user3437721

回答

0

你的代碼看起來應該是現在這個樣子!

List<List<ListItem>> parts = chopped(actualThumbs, 10); 
for(List<ListItem> list : parts) { 

    new loadActualThumbs().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, list); 

} 

我其實不知道線程池是什麼尺寸,或者如果它是一個緩存的線程池,但你可以用Executors.newCachedThreadPool()和Executors.newFixedThreadPool(int count)創建你自己的線程池......但是我只想用AsyncTask.THREAD_POOL_EXECUTOR ....應該工作:)

+0

謝謝,我不知道我在哪裏讀到Async Tasks已排隊,並且只有5個可以並行執行。我注意到,當BIG列表中有很多項目時,我的應用程序正在崩潰,例如150+。創建如此多的並行異步任務線程是非常錯誤的嗎?我的意思是 - 爲什麼甚至要砍掉大列表,爲什麼不在大列表中爲每個項目啓動和Aysnc任務,並擁有150個線程! – user3437721

+0

在我腦海中最好的事情實際上是在一個任務中運行一切,一個後臺線程並在那裏有循環。然後在循環結束時調用AsyncTask.publishProgress(ListItem ... item)並讓你的新生成/加載/無論ListItem移交給你的UI線程......問題是......你真的需要並行性嗎?或者你是否只需要在後臺完成一些工作......? – ElDuderino

+0

沒有進入兩個細節,我加載thumbails(不是來自URL!所以我不能使用Picasso或圖像加載器)。我從Dropbox加載縮略圖,它們會爲您生成一個URL,並且您必須將decodeStream轉換爲文件。每個縮略圖都需要1-2秒。如果一個文件夾中有50個縮略圖,則需要一分鐘。所以我想如果我平行執行,它將花費更少的時間......這聽起來合理嗎? – user3437721

0

如果你需要執行你的時間特定時間間隔的AsyncTask,那麼你可以利用定時器用於相同..

這樣的..

Timer timer = new Timer(); 
    TimerTask doAsynchronousTask = new TimerTask() { 
     @Override 
     public void run() { 
      try { 
       System.out 
         .println("=================== I am in pooling state ==============="); 
       GetBookingStatusAsyncTask performBackgroundTask = new GetBookingStatusAsyncTask(); 
       performBackgroundTask.execute(); 

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

     } 
    }; 

現在,當你需要殺死該定時器..

timer.cancel(); 
timer = null; 

還利用布爾檢查,以便avaoid無限循環..也就是說,如果爲true,則執行的AsyncTask ..如果爲假,則停止的AsyncTask ..只是想..

public void callAsynchronousTask(boolean b) { 

     // timer.cancel(); 
     if (b) { 

      System.out.println("============= Check for timer check " + tcheck); 
      // execute in every 10000 ms 
      tcheck++; 

     } else { 
      System.out 
        .println("============= Check for timer check + cancelling timer task " 
          + tcheck); 

      timer.cancel(); 
      timer = null; 
      System.out.println("=============timer is ===" + timer); 
      // finish(); 
      return; 
     } 

    } 

當您需要關閉此任務後來乾脆的真/假條件傳似..你需要通過這在您的AsyncTask。

callAsynchronousTask(true);/callAsynchronousTask(false); 

希望它可以幫助..

+0

我不確定這是否有幫助。我想要並行執行我的異步任務。不在計時器上。 – user3437721