2013-05-31 3 views
3

두 개의 asyc 작업이 모두 별도의 네트워크 작업을 수행합니다. 하나의 비동기 작업이 하나의 변수에 대해 다른 작업을 마칠 때까지 기다리는 것이 좋습니다. 다른 작업을 수행하는 것과 같았습니다. 첫 번째의하지만 난 ... 완료 첫 번째를 기다리는 다른 작업을해야 할 하나의 변수에 대한 asyc 작업 onPostexecute은과 효과적으로 enter image description here다른 작업이 완료 될 때까지 기다리는 Android 비동기 작업

+1

귀하의 생각은 정확했습니다. 시도해 보셨습니까? – Riser

+0

이제 구현은 li입니다. 그게 단지 ...하지만 ... 단일 변수에 대한 큰 작업을 연기해야만합니다. – paul

+0

그림을 본 것입니다. – paul

답변

3

this을 참조하면 .execute()를 사용할 수 없습니다.

먼저이처럼 작업을 시작해야합니다 :

// Start first task 
new Task1().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ""); 
// Start second task 
new Task2().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ""); 

및 작업의 양이에 액세스 할 수 있도록 당신은 정적 변수를 만들 수의

public static boolean task1Finished = false; 

그런 다음 간단한 예를 작업 :

첫 번째 작업

private class Task1 extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     Log.d("myApp", "Task1 started"); 

     for(int x = 0; x < 10; ++x) 
     { 
      try 
      { 
       Thread.sleep(1000); 
       //Log.d("myApp", "sleeped 1000 ms"); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     return ""; 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // Lets the second task to know that first has finished 
     task1Finished = true; 
    } 
} 

두 번째 작업

private class Task2 extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     Log.d("myApp", "Task2 started"); 
     while(task1Finished == false) 
     { 
      try 
      { 
       Log.d("myApp", "Waiting for Task1"); 
       Thread.sleep(1000); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 

     Log.d("myApp", "Task1 finished"); 
     // Do what ever you like 
     // ... 
     return ""; 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     Log.d("myApp", "All done here (Task2)"); 
    } 
} 
0

당신은 첫 번째 경우의 onpostExecute 다른 비동기를 작성해야하는이 달성하는 것입니다 다른 쪽을 동 기적으로 호출해야합니다.

4

어쩌면 AsyncTask를 최고의 도구가 아닙니다? 안드로이드 developper에서

인용구 : : 특히 동기화 일을 도울 수있는 안드로이드 API의 몇 가지 흥미로운 클래스가 있습니다 "네 클래스는 일반적인 특수 목적 동기화 숙어 도움

  • 세마포어는 고전적인 동시성이다. 도구입니다.

  • 해, CountDownLatch는 신호, 이벤트, 또는 조건 개최의 지정된 수까지 차단하기위한 매우 간단하면서도 매우 일반적인 유틸리티입니다.

  • 으로 CyclicBarrier는 resetta입니다 멀티 스타일 동기화 포인트는 병렬 프로그래밍의 일부 스타일에 유용합니다.
  • 교환기는 랑데부 지점에서 객체를 교환하는 두 개의 스레드를 허용하고, 여러 파이프 라인 설계에 유용하다 "그래서

난에보고 제안 :.

순환 장벽 http://developer.android.com/reference/java/util/concurrent/CyclicBarrier.html

http://developer.android.com/reference/java/util/concurrent/Exchanger.html

관련 문제