Android中循环使用AsyncTask

7
我正在创建一个应用程序,将更新城市的天气详情。循环将是一个城市列表,因此我希望在列表中尽可能多的添加城市。我将使用 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);

    }

}
4个回答

8

不要将异步任务放在循环中,而是将循环放在异步任务中,并使用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);

这应该是注释。 - Biraj Zalavadia
@sameer,请详细说明一下,我应该如何按照您的方式来做这件事。 - user2568702
我需要在循环中填充XML并放入从响应中接收到的值。我不知道该如何做。 - user2568702
请在我需要进行更改的代码上给予评论,我不明白您的意思。 - user2568702
@Sameer,请帮我一下...我需要帮助。 - user2568702
显示剩余2条评论

0

Asynctask 中有 4 种方法,其中 doInBackground() 方法用于执行后台进程并解析数据,可以在该方法中进行 HTTP 调用和数据解析;onPostExecute 方法用于执行 UI 操作,可以在该方法中进行布局填充。

@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
        }

这应该是注释 - Biraj Zalavadia

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

1
在 doInBackground 中运行一个循环。 - DropAndTrap
我认为这个评论应该添加在答案中 :) - Lucia Belardinelli

0

这里有一个例子,可以从服务器获取数据并将其存储到数据库中

在这里,我正在使用插入到数据库中的数据总数更新UI

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

希望能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接