2017-11-28 20 views
0

내 Android 앱에는 서로 의존하는 최대 4 개의 비동기 작업이 있습니다. 즉, 하나의 작업이 완료되어야 다음 작업이 검색된 데이터로 진행될 수 있습니다.중첩 된 AsyncTasks를 사용하는 가장 좋은 방법은 무엇입니까?

final AsyncTask<Void, Void, Boolean> taskOne = new AsyncTask<Void, Void, Boolean>() { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     // retrieve required data 
     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean success) { 
     if (success) { 
      // start second task here 
      final AsyncTask<Void, Void, Boolean> taskTwo = new AsyncTask<Void, Void, Boolean>() { 
       @Override 
       protected void onPreExecute() { 
        super.onPreExecute(); 
       } 

       @Override 
       protected Boolean doInBackground(Void... params) { 
        // retrieve required data 
        return true; 
       } 

       protected void onPostExecute(Boolean success) { 
        if (success) { 
         // start third task here 
         final AsyncTask<Void, Void, Boolean> taskThree = new AsyncTask<Void, Void, Boolean>() { 
          @Override 
          protected void onPreExecute() { 
           super.onPreExecute(); 
          } 

          @Override 
          protected Boolean doInBackground(Void... params) { 
           // retrieve required data 
           return true; 
          } 

          protected void onPostExecute(Boolean success) { 
           if (success) { 
            // and so on ... 
           } 
          } 
         } 

         taskThree.execute(); 
        } 
       } 
      } 

      taskTwo.execute(); 
     } 
    } 
} 

taskOne.execute(); 

은 무엇보다 읽을 수있는 코드로이 동작을 달성하기 위해 가장 좋은 방법이 될 것입니다 : 코드 이런 식으로 뭔가를 찾을 때 지금이 어떤 점에서 매우 불분명 할 수 있는가?

미리 감사드립니다.

+0

세 개의 클래스를 만들고 onPostExecute()에서 new TaskTwo()와 같은 다른 클래스를 호출하면됩니다. execute() – Kuls

+0

하나의 클래스 만 사용할 수도 있지만 이전 응답에 따라 다른 클래스를 건설자. – jorjSB

+0

이런 식으로'RxJava'를 사용할 것을 권한다. –

답변

2

TaskOne

Class TaskOne extends AsyncTask{ 

    onPostExecute(boolean success){ 
    if(success){ 
     new TaskTwo().execute(); 
    } 
    } 
} 

TaskTwo

Class TaskTwo extends AsyncTask{ 

    onPostExecute(boolean success){ 
    if(success){ 
     new TaskThree().execute(); 
    } 
    } 
} 

TaskThree

Class TaskThree extends AsyncTask{ 

     onPostExecute(boolean success){ 
     if(success){ 
      //do something 
     } 
     } 
} 
처럼 보인다
+0

나는 당신의 접근법을 사용하여 끝내었고 그것이해야하는 것처럼 일하고 있습니다. 빠른 도움에 감사드립니다! – Bautzi89

1

나는 Interface와 충돌해야한다고 생각합니다. 귀하의 경우 리스너 또는 콜백이라고합니다. 나는 코드를 테스트하지 않았다. 그러나 그

Class A extend Activity implement ServerRequestListener{ 


      public ServerRequestListener listener; 

      @Override 
      onCreate (Bundle bundle){ 
       listener = this; 
       doTaskOne(); 
      } 

      public void doTaskOne(){ 
       final AsyncTask<Void, Void, Boolean> taskOne = new AsyncTask<Void, Void, Boolean>() { 
        @Override 
        protected void onPreExecute() { 
         super.onPreExecute(); 
        } 

        @Override 
        protected Boolean doInBackground(Void... params) { 
         // retrieve required data 
         return true; 
        } 

        @Override 
        protected void onPostExecute(Boolean success) { 
         if (success) { 
          listener.onSuccess(new JSON()); 
         } 
        } 
      } 

      taskOne.execute(); 

     } 



     public interface ServerRequestListener { 
       void onSuccess(Json); 
       void onFailure(Error); 
     } 


     @Override 
     onSuccess(Json json){ 
      //call second task 
     } 

     @Override 
     onFailure(Error error){ 

     } 

    }