2014-11-07 6 views
0

안녕하세요 모두가 문제가, 내가 여러 asyc 작업에, 나는 그 작업이 완료되면 메서드를 호출하고 싶습니다. 확인하십시오.완료 후 호출 메서드 여러 AsyncTask

  for (ClientsDetailDAO clientsDetailDAO : clients) { 
       Log.d(TAG, "onConnected for"); 
       Addresses addresses = clientsDetailDAO.getAddress(); 
       StringBuilder sb = null; 
       if (addresses != null) { 
        Log.d(TAG, "onConnected address not null"); 
        sb = new StringBuilder(addresses.getStreetAddress()) 
          .append(", ").append(addresses.getCity()) 
          .append(", ").append(addresses.getState()) 
          .append(", ").append(addresses.getZip()); 
        Log.d(TAG, "Address formatted: " + sb.toString()); 

        mAddressAsyncTask = new GetAddressAsyncTask(
          clientsDetailDAO); 
        mAddressAsyncTask.execute(sb.toString()); 

       } 
       } 

개인 클래스 GetAddressAsyncTask은 AsyncTask를 { 개인 ClientsDetailDAO clientsDetailDAO을 확장;

public GetAddressAsyncTask(ClientsDetailDAO clientsDetailDAO) { 
     this.clientsDetailDAO = clientsDetailDAO; 

    } 

    @Override 
    protected LatLng doInBackground(String... params) { 
     Geocoder geoCoder = new Geocoder(getActivity()); 
     LatLng latLng = null; 
     try { 
      List<Address> addresses = geoCoder.getFromLocationName(parmas.toString, 
        1); 
      Log.i(TAG, "param " + params[0] + " addresses size: " 
        + addresses.size()); 
      if (addresses.size() > 0) { 
       latLng = new LatLng(addresses.get(0).getLatitude(), 
         addresses.get(0).getLongitude()); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     if (isCancelled()) 
      return null; 
     return latLng; 
    } 

    @Override 
    protected void onPostExecute(LatLng result) { 

     if (result != null) { 
      Log.d(TAG, "onConnected latLng not null"); 
      clientsDetailDAO.setLatitude(result.latitude); 
      clientsDetailDAO.setLongitude(result.longitude); 

      Toast.makeText(getActivity(), "in post" + result.latitude, 
        Toast.LENGTH_LONG).show(); 

     } else { 
      Log.d(TAG, "onConnected latLng null"); 
     } 



    } 
} 

finsih 이러한 작업 후 나는 setUpMarker()를 호출하려고합니다. 방법.

+0

count가 여러 작업 수와 일치하면 onPostExecute()에서 여러 작업 수를 추적 한 다음 setUpMarker()를 호출하십시오. –

+0

내가 할 수 있지만 내 다음 코드를 참조하십시오. – aditay

답변

1

여러 AsyncTasks (하위)를 시작하는 AsyncTask (부모)를 시작하십시오. 각 어린이는 완료시 부모에게 통보합니다.

public class ParentAsyncTask extends AsyncTask... implements OnTaskCompletedListener{ 

    private int tasksRunning = 0; 

    @Override 
    protected LatLng doInBackground(...) { 
     tasksRunning = clients.size(); 
     // spawn multiple AsyncTask 
     for (ClientsDetailDAO clientsDetailDAO : clients) { 
       Log.d(TAG, "onConnected for"); 
       Addresses addresses = clientsDetailDAO.getAddress(); 
       StringBuilder sb = null; 
       if (addresses != null) { 
        Log.d(TAG, "onConnected address not null"); 
        sb = new StringBuilder(addresses.getStreetAddress()) 
          .append(", ").append(addresses.getCity()) 
          .append(", ").append(addresses.getState()) 
          .append(", ").append(addresses.getZip()); 
        Log.d(TAG, "Address formatted: " + sb.toString()); 

        mAddressAsyncTask = new GetAddressAsyncTask(
          clientsDetailDAO); 
        mAddressAsyncTask.execute(sb.toString()); 

       } 
     } 
    }      

    @Override 
    void onTaskCompleted(...){ 
     tasksRunning--; 
     if (tasksRunning == 0){ 
      doSomethingAfterAllTasksFinished(); 
     }   
    } 

} 
0

를 호출 setUpMarker() INT 최신 AsyncTask를의 onPost 방법

예는 3 비동기이있을 때 :

  1. 1 비동기 실행
  2. 는 3 비동기 실행 onPost 비동기 1 내부 2 비동기 실행 2 차 비동기 내부 onPost

경주 상태를 피하기 위해 으로 전화하여 asyncTask을 호출하기 전에 첫 번째 asyncTask이 완료되었는지 확인해야합니다.

+0

asynctasks가 순차적으로 안드로이드에서 실행됩니다. – cliffroot

+0

덕분에 도움을 주지만, 저는 DAO 클래스를 가지고 있습니다. 주소가 다음 asyc 클래스 호출 존재하는 경우 루프를 사용하고 있습니다. 그래서 어떻게 이런 자세를 취할 수 있죠. – aditay

0

모든 작업을 배열에 저장할 수 있으며 onPostExecute에서 이러한 작업이 완료되었는지 (getStatus 메서드 사용) 확인합니다.

+0

나는 다음 코드를 안다. – aditay

0

비동기 수가 고정되어 있고 2라고 할 수있는 경우 전역 int [2] 배열을 가져옵니다.

onPostExecute{  // Async 1 
    array[0]=1; 
    if(checkIfAllArraySet()) 
    finalMethod(); 
} 

onPostExecute{  // Async 2 
    array[1]=1; 
    if(checkIfAllArraySet()) 
    finalMethod(); 
} 


boolean checkIfAllArraySet() 
{ 
    // check if all arra[] items are 1 with a loop 
} 
관련 문제