2015-06-07 2 views
1

Я разрабатываю приложение с android, я новичок в нем в одной части моих проектов Мне нужно получить данные от полей ввода от пользователей, а затем создать Http-соединение с сервером и поместите результат первого вызова вместе с некоторыми другими полями в другое соединение Http с сервером, я не знаю, какой правильный подход его реализовать.два зависимых HttpUrlConnection с AsyncTask в android

public class TwoHttpActivity extends ActionBarActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.my_transport); 
    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.container, new PlaceholderFragment()) 
       .commit(); 
    } 
} 
public static class PlaceholderFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       params[0] = firstText; 
       . . . . 
       . . . . 
       params[3] = secondText; 
      } 
     }); 
    } 
} 

Вопрос: Теперь мне нужно PARAMS [0] для отправки на один URL http://myserver/urlOne, а затем получить результат от сервера и поместить их вместе с Params [1] для Params [3] и послать их вместе на второй URL сервера http://myserver/urlTwo

Поскольку эти соединения должны быть выполнены в classes простирается от AsyncTask, то я думаю, что это не возможно просто

public class FirstUrlTask extends AsyncTask<String[], Void, Void> { 
    //the class handles the call to first url inside 
    //doInBackground(String[]... params) 
} 

и

public class SecondUrlTask extends AsyncTask<String[], Void, Void> { 
     //the class handles the call to second url inside 
    //doInBackground(String[]... params) 
    } 

, а затем

firstUrlTask.execute(..); 
secondUrlTask.execute(..); 

внутри button.setOnClickListener(new View.OnClickListener()

Поскольку они являются асинхронные задачи не ясно, какие задачи будут выполняться первым, поэтому, пожалуйста, помогите мне с правильным подходом, пожалуйста, предоставьте свой ответ с подробной информацией и образцом кода.

ответ

3

Делают это так:

первый шаг: Вызов FirstUrlTask ​​асинхронный Класс

firstUrlTask.execute(..); 

Второй шаг: Вызов SecondUrlTaskAsync класса в onPostExecute() из FirstUrlTask ​​

public class FirstUrlTask extends AsyncTask<String[], Void, Void> { 

    //doInBackground(String[]... params) {} 

    protected void onPostExecute(ClassTypeYouReturning result){ 
     super.onPostExecute(); 
     secondUrlTask.execute(..); //Call to second url 
    } 
} 

выше подход гарантирует, что первый вызов будет выполнен к первому URL и ответ первого URL, то второй адрес будет называться.

1

от того, что я понял, вам нужно позвонить FirstUrlTask, а затем он будет получать данные с сервера и после этого вы должны передать эти данные в SecondUrlTask выполнять другие действия, которые зависят от данных, полученных от первого asyncTask, вам можно просто назвать свою первую задачу в свой onClickListener(), а затем вызвать вторую на в onPostExecute() способе первого одного

+0

No. Не в doInBackground. Сделайте это в onPostExecute. – greenapps

1

В зависимости от ваших данных, которые могут быть загружены, вы можете использовать только один AsyncTask (если 2 задания не занимают много времени). Ниже приведен фрагмент кода для AsyncTask. Для передачи значений в ваш AsyncTask вы можете передать его как arguments, например your_async_task.exectue(your_array_of_strings), или вы можете использовать constructor, чтобы передать свои значения.

class SingleAsyncTask extends AsyncTask<String, Void, Void> { 

    final String[] params; 

    public SingleAsyncTask() { 
     // default constructor 
    } 

    public SingleAsyncTask(String... params) { 
     this.params = params; 
    } 

    // the class handles the call to first url inside 
    // doInBackground(String[]... params) 

    @Override 
    protected Void doInBackground(String... params) { 
     if (params != null && params.length > 0) { 
      // #STEP 1 
      String param0 = params[0]; 
      // make request to 1st URL http://myserver/urlOne 

      // #STEP 2 
      // when you get a success for 1st URL fire the request for 2nd URL 
      // I consider it as 3 as per your problem statement but you can tune 
      // as it suites you 
      if (params.length > 3) { 
       String param1 = params[1]; 
       // and so on 
       // fire request for http://myserver/urlTwo along with result you obtained in step1 
      } 
     } 

     // but try-catch blocks for above statements, as per exceptions you 
     // think you need to handle and return final result for "onPostExecute" 


     // default return could be null 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     // notify your UI 
    } 

} 

Надеюсь, это поможет!

Смежные вопросы