返回信息流背景:
最近试着自己写个天气软件,用到了下拉刷新(android-Ultra-Pull-To-Refresh)和网络请求第三方库(android-async-http)。
程序结构:
我单独写了一个类getweatherinfo,用来请求天气数据,并保存。在下拉刷新组件的业务事件响应方法
onRefreshBegin()中获取getweatherinfo类中的天气数据。参考下面代码片段:mPtrFrame.setPtrHandler(new PtrHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
// TODO Auto-generated method stub
Log.i("Test-------------->", "onRefreshBegin");
final GetWeatherInfo weatherget = new GetWeatherInfo("北京");
weatherget.getWeather();// 下面说明
while(true)
{
if(weatherget.isWeatherGot())// 判断是否获得了天气数据
{
break;
}
}
weatherget.getWeather();是GetWeatherInfo 类中定义的一个方法,里面新建了3个AsyncHttpClient从不同API获取不同的天气数据。所有天气数据都作为GetWeatherInfo 类的成员,以供外部使用。简化代码如下(只保留一个AsyncHttpClient和部分天气数据):
public class GetWeatherInfo {
int ifOk = 0;
public String city;// 检索的地区
// 实时天气
String dateTime; // 日期
public String temp; // 实时温度
String minTemp;
String maxTemp;
String weather;// 实时天气
public GetWeatherInfo(String city) {
this.city = city;
}
public void getWeather() {
// 获取实时天气
AsyncHttpClient clientCurrent = new AsyncHttpClient();
RequestParams paramsCurrent = new RequestParams();
paramsCurrent.put("district", city);
paramsCurrent.put("format", "json");
paramsCurrent.put("authkey", "41365e31254a4b2ca0b43e4a3e3c229c");
clientCurrent.get("http://api.36wu.com/Weather/GetWeather",
paramsCurrent, new TextHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers,
String responseString) {
// TODO Auto-generated method stub
try {
ifOk += statusCode;
JSONObject jo = new JSONObject(responseString);
String dataString = jo.getString("data");
JSONObject data = new JSONObject(dataString);
dateTime = data.getString("dateTime"); // 1
temp = data.getString("temp");
minTemp = data.getString("minTemp");
maxTemp = data.getString("maxTemp");
weather = data.getString("weather");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onFailure(int arg0, Header[] arg1, String arg2,
Throwable arg3) {
// TODO Auto-generated method stub
}
});
}
public boolean isWeatherGot() {
if (ifOk != 0) {// 上面获取网络数据返回的statusCode都不是0,这里简单判断一下
return true;
} else {
return false;
}
}
}
问题来了:
经过调试,发现onRefreshBegin()函数中weatherget对象内容都是空的!!!!这是为什么呢?
我知道AsyncHttpClient是异步的,但是它们都是同一个weatherget对象发起的啊,修改的都是同一个weatherget对象里的数据啊,怎么会都是空呢?
补充:
1、将GetWeatherInfo类中获取天气数据的代码块 写到onRefreshBegin中就可以获得天气数据了。
————————————————————————————————————————————
快来大神帮帮我 我实在想不出来了。。[ema1][ema1]
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #23056同步于 2015/6/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
【android-async-http】遇到了奇怪的问题。。百思不得其解
A001
2015/6/18镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
虽然没太懂,但“将GetWeatherInfo类中获取天气数据的代码块 写到onRefreshBegin中就可以获得天气数据了。”,网络请求怎么可以放在主线程中呢
哦 是这样的 虽然是放到主线程里面 但是AsyncHttpClient会自动创建一个新线程来请求网络数据
【 在 sollian 的大作中提到: 】
: 虽然没太懂,但“将GetWeatherInfo类中获取天气数据的代码块 写到onRefreshBegin中就可以获得天气数据了。”,网络请求怎么可以放在主线程中呢
调试过,进不去onSuccess() 但是在主线程里使用就可以进去。。
我想 是不是应该把获取天气数据放到一个Service里面,而不是仅仅写到一个类里面调用?
但是我又觉得另外写一个类 跟 直接写到主线程里面 好像没啥差别。。
【 在 dss886 的大作中提到: 】
: 有没有单步调试过onSuccess()里的代码?
另外定义一个类实现网络请求的话 进不了onSuccess 我都怀疑里面新建的网络请求线程还在不在
【 在 sollian 的大作中提到: 】
: 调试的话,看看 网络请求有没有执行,onSuccess有没有执行
这个多线程真的太乱了……
【 在 A001 (天逸云舒) 的大作中提到: 】
: 调试过,进不去onSuccess() 但是在主线程里使用就可以进去。。
: 我想 是不是应该把获取天气数据放到一个Service里面,而不是仅仅写到一个类里面调用?
: 但是我又觉得另外写一个类 跟 直接写到主线程里面 好像没啥差别。。