Android Asynk任务在循环中调用,未返回值

Android Asynk任务在循环中调用,未返回值,android,android-asynctask,android-inflate,Android,Android Asynctask,Android Inflate,我试图创建一个应用程序,将更新多个城市的天气。每行将有不同的温度,所以我有一个AsynkTask使用。但是在得到API的响应后,我无法更新UI private WeatherResponse requestWeatherUpdate(String location) { url = "" + location; Log.d("URL for Weather Upadate", url); WeatherUpdateA

我试图创建一个应用程序,将更新多个城市的天气。每行将有不同的温度,所以我有一个AsynkTask使用。但是在得到API的响应后,我无法更新UI

private WeatherResponse requestWeatherUpdate(String location) {
        url = ""
                + location;
        Log.d("URL for Weather Upadate", url);
        WeatherUpdateAsyncTask weatherReq = new WeatherUpdateAsyncTask();
        String weatherRequestResponse="";
        try {
            weatherRequestResponse=weatherReq.execute(url).get();
            parsedWeatherResponse = ParseWeatherResponseXML
                    .parseMyTripXML(weatherRequestResponse);
        } catch (InterruptedException e) {

            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return parsedWeatherResponse;

    }
我的主要活动

public class MainActivity extends Activity {
    LinearLayout depart_arrivals_details;
    LayoutInflater inflater;
    TextView depart_time,
    depart_airport_city, depart_airport, arrival_time,
    arrival_airport_city, arrival_airport, pnr_number,temprature,humidity;
    ImageView flight_depart_image;
    public static String url = "";
    WeatherResponse response;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        depart_arrivals_details = (LinearLayout) findViewById(R.id.depart_arrivals_details);
        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        setSectorData();
    }

    void setSectorData() {
        for (int i = 0; i < 1; i++) {
            inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            RelativeLayout layout = (RelativeLayout) inflater.inflate(
                    R.layout.sector_details, depart_arrivals_details, false);
            depart_time = (TextView)layout.findViewById(R.id.depart_time);
            depart_airport_city = (TextView)layout.findViewById(R.id.depart_airport_city);
            temprature = (TextView)layout.findViewById(R.id.temprature);
            humidity = (TextView)layout.findViewById(R.id.humidity);
            flight_depart_image = (ImageView)layout.findViewById(R.id.flight_depart_image);
            WeatherResponse responseUpdate = requestWeatherUpdate("DEL");

        depart_time.setText("20:45");
        depart_airport_city.setText("Mumbai");
        /*
         * This part will be updated when we will se the request and get the response 
         * then we have to set the temp and humidity for each city that we have recived
         * */
        temprature.setText(responseUpdate.getTempInC()+(char) 0x00B0);//Here it is showing null pointer exception after that the respone is coming from the server .So can we do this 
        humidity.setText(responseUpdate.getHumidity());

            flight_depart_image.setImageResource(R.drawable.f1);

            depart_arrivals_details.addView(layout, i);
        }
    }

    /*
     * Here the location will be dynamic and have to send the request for all the location i have 
     * */
    private WeatherResponse requestWeatherUpdate(String location) {
        url = "http://api.worldweatheronline.com/free/v1/weather.ashx?&format=xml&num_of_days=2&key=uysakmq923nbd5y549yz3aaw&q="
                + location;
        Log.d("URL for Weather Upadate", url);
        WeatherUpdateAsyncTask weatherReq = new WeatherUpdateAsyncTask(new CallBack() {
            @Override
            public void run(Object result) {
                try {
                    String AppResponse = (String) result;
                    response = ParseWeatherResponseXML
                            .parseMyTripXML(AppResponse);
                } catch (Exception e) {
                    Log.e("TAG Exception Occured",
                            "Exception is " + e.getMessage());
                }
            }
        });
        weatherReq.execute(url);
        return response;

    }
private WeatherResponse requestWeatherUpdate(String location) {
        url = ""
                + location;
        Log.d("URL for Weather Upadate", url);
        WeatherUpdateAsyncTask weatherReq = new WeatherUpdateAsyncTask();
        String weatherRequestResponse="";
        try {
            weatherRequestResponse=weatherReq.execute(url).get();
            parsedWeatherResponse = ParseWeatherResponseXML
                    .parseMyTripXML(weatherRequestResponse);
        } catch (InterruptedException e) {

            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return parsedWeatherResponse;

    }

如果我试图设置接收到的值是抛出空指针异常

,则可以在使用
AsyncTask
onPostExecute()
获得结果后,更新UI
线程上运行的
视图。另外,您需要调用
AsyncTask
execute()
,才能真正启动
AsyncTask

试试这个

private WeatherResponse requestWeatherUpdate(String location) {
        url = ""
                + location;
        Log.d("URL for Weather Upadate", url);
        WeatherUpdateAsyncTask weatherReq = new WeatherUpdateAsyncTask();
        String weatherRequestResponse="";
        try {
            weatherRequestResponse=weatherReq.execute(url).get();
            parsedWeatherResponse = ParseWeatherResponseXML
                    .parseMyTripXML(weatherRequestResponse);
        } catch (InterruptedException e) {

            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return parsedWeatherResponse;

    }
循环中的第一个

depart_arrivals_details.removeAllViews();
 for (int i = 0; i < 2; i++) {
            requestWeatherUpdate("BLR");
            }
private WeatherResponse requestWeatherUpdate(String location) {
        url = ""
                + location;
        Log.d("URL for Weather Upadate", url);
        WeatherUpdateAsyncTask weatherReq = new WeatherUpdateAsyncTask();
        String weatherRequestResponse="";
        try {
            weatherRequestResponse=weatherReq.execute(url).get();
            parsedWeatherResponse = ParseWeatherResponseXML
                    .parseMyTripXML(weatherRequestResponse);
        } catch (InterruptedException e) {

            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return parsedWeatherResponse;

    }
然后AsynkTask

private WeatherResponse requestWeatherUpdate(String location) {
        url = ""
                + location;
        Log.d("URL for Weather Upadate", url);
        WeatherUpdateAsyncTask weatherReq = new WeatherUpdateAsyncTask();
        String weatherRequestResponse="";
        try {
            weatherRequestResponse=weatherReq.execute(url).get();
            parsedWeatherResponse = ParseWeatherResponseXML
                    .parseMyTripXML(weatherRequestResponse);
        } catch (InterruptedException e) {

            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return parsedWeatherResponse;

    }
public class WeatherUpdateAsyncTask extends AsyncTask<String, Void, String> {
    Context context;
    CallBack callBack;

   @Override
    protected String doInBackground(String... arg0) {
        String responseString = "";
        HttpClient client = null;
        try {
            client = new DefaultHttpClient();
            HttpGet get = new HttpGet(arg0[0]);
            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) {
       super.onPostExecute(result);
    }

}
公共类WeatherUpdateAsyncTask扩展异步任务{
语境;
回调;
@凌驾
受保护的字符串doInBackground(字符串…arg0){
字符串responseString=“”;
HttpClient=null;
试一试{
client=新的DefaultHttpClient();
HttpGet=newhttpget(arg0[0]);
client.getParams().setParameter(“http.socket.timeout”,6000);
client.getParams().setParameter(“http.connection.timeout”,6000);
HttpResponse responseGet=client.execute(get);
HttpEntity-resEntityGet=responseGet.getEntity();
如果(当前设置!=null){
responseString=EntityUtils.toString(当前设置);
Log.i(“获取响应”,responseString.trim());
}
}捕获(例外e){
Log.d(“ANDRO_ASYNC_ERROR”,“ERROR is”+e.toString());
}
Log.d(“ANDRO_异步_响应”,responseString.trim());
client.getConnectionManager().shutdown();
返回responseString.trim();
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
}
}

所以我可以这样做吗?我不明白。请详细说明我在AndroidMManuel中是新手,这意味着您必须在requestWeatherUpdate方法中调用weatherReq.execute()。您还需要在任务中重写onPostExecute(),以更新用户界面。在第一次
requestWeatherUpdate(字符串位置)
中,您正在调用
execute()
,但在第二次调用中,您没有
onPostExecute()
驻留在UI
Thread
上,这意味着您可以返回在
doInBackgroind()
中得到的结果
字符串,并在我调用weatherReq.execute(url)的requestWeatherUpdate中的
onPostExecute()
中更新您的UI;好的,在同一个函数requestWeatherUpdate中,我也解析了响应。现在我要更改哪部分,我需要将asynktask类作为一个内部类吗class@Rahul:尝试使用postinvalidate();要更新UI,请使用此设置值temprature.setText(parsedWeatherResponse.getTempInC()+(char)0x00B0);