2013-10-03 2 views
4

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

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); 

    } 

} 

ответ

0

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

@Override 
     protected Void doInBackground(Void... arg0) { 
      // TODO Auto-generated method stub 

      //Make your HTTP call and parse data 

      return null; 
    } 

и взаимодействие UI

@Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
      // Inflate layout here 
     } 
+0

это должен быть комментарий –

+0

как я буду называть это в цикле см. Обновленный вопрос –

7

Вместо Сохраняя Асинхронные задачи в Loop, Keep Loop внутри асинхронным. и используйте 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); 
+0

Это должен быть комментарий. –

+0

@sameer, пожалуйста, уточните, как я могу сделать это по-вашему. –

+0

@Rahul CHeck мое обновление – Sameer

0
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; 
     } 
    } 
+0

как я буду называть это в цикле уже есть это –

+1

запустить цикл внутри doInBackground – DropAndTrap

+0

Я думаю, что этот комментарий должен быть добавлен в ответ :) –

0

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

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

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(); 

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