AsyncTask в Loop в Android

Я создаю приложение, которое будет обновлять данные о погоде в городе. Цикл будет List of City. Так что я хочу, чтобы в нем были такие города, как List.I будет использовать метод AsyncTask для отправки запроса и анализа Это. И в то же время я раздуваю макет, и я должен поместить все данные о погоде, соответствующие городу в макете. Как я могу достичь этого, пожалуйста, помогите мне в этом.

XML- файл, который я раздуваю

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/depart_details" android:layout_width="wrap_content" android:layout_height="wrap_content" > <ImageView android:id="@+id/flight_depart_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:padding="3dip" android:layout_marginTop="10dp" android:src="@drawable/f1" /> <TextView android:id="@+id/depart_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="5dp" android:layout_toRightOf="@+id/flight_depart_image" android:text="" android:textColor="#666666" android:textSize="25sp" android:textStyle="bold" /> <TextView android:id="@+id/depart_airport_city" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="5dp" android:layout_toRightOf="@+id/depart_time" android:text="" android:textColor="#666666" android:textSize="15sp" android:textStyle="bold" /> <TextView android:id="@+id/depart_airport" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/depart_airport_city" android:layout_marginLeft="125dp" android:text="N/A" android:textColor="#666666" android:textSize="12sp" android:textStyle="bold" /> <ImageView android:id="@+id/weather_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft ="40dp" android:layout_toRightOf="@+id/depart_airport" android:src="@drawable/image" /> <TextView android:id="@+id/tempraturetext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="3dp" android:layout_toRightOf="@+id/weather_image" android:text="Temp:" /> <TextView android:id="@+id/temprature" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="3dp" android:layout_toRightOf="@+id/tempraturetext" android:text="20℃" /> <TextView android:id="@+id/humidity_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/temprature" android:layout_marginLeft="3dp" android:layout_toRightOf="@+id/weather_image" android:text="Humidity:" /> <TextView android:id="@+id/humidity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/temprature" android:layout_marginLeft="3dp" android:layout_toRightOf="@+id/humidity_text" android:text="32" /> <LinearLayout android:layout_width="match_parent" android:layout_height="1dp" android:layout_below="@+id/depart_airport" android:layout_marginTop="5dp" android:background="#d3d3d3" > </LinearLayout> 

Эта функция, которую я создал для отправки запроса

 private WeatherResponse requestWeatherUpdate(String location) { url = "" + location; //This location will be dyanamic and multiple Log.d("URL for Weather Upadate", url); WeatherUpdate weatherReq = new WeatherUpdate(new CallBack() { @Override public void run(Object result) { try { AppResponse = (String) result; response = ParseWeatherResponseXML .parseMyTripXML(AppResponse); } catch (Exception e) { Log.e("TAG Exception Occured", "Exception is " + e.getMessage()); } } }); weatherReq.execute(url); return response; } 

AsynkTask

 public class WeatherUpdate extends AsyncTask<String, Void, String> { Context context; CallBack callBack; public WeatherUpdate(CallBack callBack) { this.callBack = callBack; } @Override protected String doInBackground(String... arg0) { String responseString = ""; HttpClient client = null; try { client = new DefaultHttpClient(); HttpGet get = new HttpGet(IweenTripDetails.url); client.getParams().setParameter("http.socket.timeout", 6000); client.getParams().setParameter("http.connection.timeout", 6000); HttpResponse responseGet = client.execute(get); HttpEntity resEntityGet = responseGet.getEntity(); if (resEntityGet != null) { responseString = EntityUtils.toString(resEntityGet); Log.i("GET RESPONSE", responseString.trim()); } } catch (Exception e) { Log.d("ANDRO_ASYNC_ERROR", "Error is " + e.toString()); } Log.d("ANDRO_ASYNC_RESPONSE", responseString.trim()); client.getConnectionManager().shutdown(); return responseString.trim(); } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); callBack.run(result); } } 

    Вместо того, чтобы хранить AsynChronous Task в Loop, продолжайте цикл внутри AsynChronous. И использовать onProgressUpdate для обновления интерфейса.

    Обновлено для примера кода

     public class Asyn extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... params) { for (String location : params) { String tmp = getTemp(location); publishProgress(tmp); /** Use Result **/ } return null; } /** * Calculate Weather * * @param location * @return */ private String getTemp(String location) { return location; } @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); Log.e("Temo", values[0]); } } 

    И передайте массив местоположений, где вы начинаете процесс

      Asyn m = new Asyn(); String arrryaLocation = null; // your vales m.execute(arrryaLocation); 

    В Asynctask есть 4 метода. Сделайте свой HTTP-вызов и данные анализа в doInBackground (), который используется для выполнения фоновых процессов и раздувания метода inonPostExecute Layout, который используется для выполнения пользовательских интерфейсов.

     @Override protected Void doInBackground(Void... arg0) { // TODO Auto-generated method stub //Make your HTTP call and parse data return null; } 

    И взаимодействие с пользовательским интерфейсом

     @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); // Inflate layout here } 
      class MyAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected void onPostExecute(Void result) { super.onPostExecute(result); //parseing all details } @Override protected void onPreExecute() { super.onPreExecute(); // set up values for required params } @Override protected Void doInBackground(Void... arg0) { //make the web service call here return null; } } 

    Вот один пример для получения данных с сервера и хранения его в БД

    Здесь я обновляю пользовательский интерфейс с общим количеством данных, которое вставляется в БД

      private class async extends AsyncTask<String, String, Boolean> { Context context; ProgressDialog pd; boolean flag ; Progress progress; async(Context mcontext) { context = mcontext; pd = new ProgressDialog(activityContext); progress = new Progress(this); } @Override protected void onPreExecute() { pd.setTitle("Loading.."); pd.setMessage("Please Wait...! " + NO + " Record Inserted"); pd.setCancelable(false); pd.show(); super.onPreExecute(); } @Override protected Boolean doInBackground(String... params) { return flag = = getData(progress); } @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); pd.setMessage("Please Wait..." + values[0].toString()); } public class Progress { public async task; public Progress(async task) { this.task = task; } public void publish(String value) { task.publishProgress(value); } } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); if(pd.isShowing()) pd.dismiss(); } } 

    Вот класс GetData:

     public boolean getData(Progress progress) { while(true) // here you can use your loop { try { SoapObject soReturn ; if(soReturn != null) { No = mNumber; // here i am getting total number is inserted in db progress.publish(No); // No is published and sent it to progress update method. return true ; } 

    Назовите его

     new async(context).execute(); 

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