2014-04-16 3 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); 
    } 

편집 :
내가 대신 목록의 목록을 통해 모든 나는 다른 목록에 비동기 작업에 보낼 목록, 다음 루프를 추가하고 각 하나를 보내, 내 코드를 변경 시도 : 당신은 시간의 특정 기간에 대한 AsyncTask를 실행해야하는 경우

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

또한 - 제 코드는 큰 목록을 (각 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

감사합니다. 비동기 작업이 대기 중이며 5 개만 병렬로 실행할 수 있다고 읽었습니다. 나는 BIG 목록에 많은 항목이있을 때 내 앱이 충돌하는 것을 알아 챘다. 150+너무 많은 병렬 비동기 작업 스레드를 만드는 것은 매우 잘못된 것입니까? 내 말은 - 큰 목록을 잘라내는 이유, 큰 목록의 각 항목에 대해 Aysnc 작업을 시작하고 150 개의 스레드가있는 이유는 무엇입니까! – user3437721

+0

내 마음 속의 가장 좋은 점은 실제로 모든 작업을 하나의 백그라운드 스레드에서 실행하고 거기에 루프가있는 것입니다. 그런 다음 루프의 끝에서 AsyncTask.publishProgress (ListItem ... item)를 호출하고 새로 생성 /로드 된 ListItem을 UI 스레드에 넘겨 주어야합니다 ... 질문은 ... 실제로 병렬 처리가 필요합니까? 아니면 백그라운드에서 수행해야 할 작업이 필요합니까 ...? – ElDuderino

+0

두 가지 세부 사항을 설명하지 않고 URL (Picasso 또는 Image Loader를 사용할 수 없음)에서 미리보기 이미지를로드하고 있습니다. Dropbox에서 미리보기 이미지를로드 중입니다. URL을 생성하고 파일을 decodeStream해야합니다. 각 미리보기 이미지에 대해이 작업을 수행하는 데 1-2 초가 소요됩니다. 폴더에 50 개의 작은 이미지가있는 경우 1 분 이상 소요됩니다. 그래서 병렬로 실행하면 훨씬 적은 시간이 걸리 겠지만 ... 합리적이라고 생각하니? – user3437721

0

당신은 동일을위한 타이머의 사용을 할 수 있습니다 ..이처럼

을 ..

0 이제이 타이머를 죽일 필요가있을 때
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; 
     } 

    } 

당신이 ..you이 AsyncTask를이 전달해야처럼 통과 단순히 참/거짓 조건의 다음이 작업을 닫아야합니다.

callAsynchronousTask(true);/callAsynchronousTask(false); 

는 희망이 도움이 ..

+0

이것이 도움이되는지 확실하지 않습니다. 내 비동기 작업을 병렬로 실행하고 싶습니다. 타이머가 아닙니다. – user3437721