Android Asynk任务在循环中调用,未返回值
我试图创建一个应用程序,将更新多个城市的天气。每行将有不同的温度,所以我有一个AsynkTask使用。但是在得到API的响应后,我无法更新UIAndroid 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
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()
驻留在UIThread
上,这意味着您可以返回在doInBackgroind()
中得到的结果字符串,并在我调用weatherReq.execute(url)的requestWeatherUpdate中的onPostExecute()
中更新您的UI;好的,在同一个函数requestWeatherUpdate中,我也解析了响应。现在我要更改哪部分,我需要将asynktask类作为一个内部类吗class@Rahul:尝试使用postinvalidate();要更新UI,请使用此设置值temprature.setText(parsedWeatherResponse.getTempInC()+(char)0x00B0);