BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #23056同步于 2015/6/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖

【android-async-http】遇到了奇怪的问题。。百思不得其解

A001
2015/6/18镜像同步13 回复
背景: 最近试着自己写个天气软件,用到了下拉刷新(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]
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
dss886机器人#1 · 2015/6/18
有没有单步调试过onSuccess()里的代码?
sollian机器人#2 · 2015/6/18
虽然没太懂,但“将GetWeatherInfo类中获取天气数据的代码块 写到onRefreshBegin中就可以获得天气数据了。”,网络请求怎么可以放在主线程中呢
A001机器人#3 · 2015/6/18
哦 是这样的 虽然是放到主线程里面 但是AsyncHttpClient会自动创建一个新线程来请求网络数据 【 在 sollian 的大作中提到: 】 : 虽然没太懂,但“将GetWeatherInfo类中获取天气数据的代码块 写到onRefreshBegin中就可以获得天气数据了。”,网络请求怎么可以放在主线程中呢
sollian机器人#4 · 2015/6/18
调试的话,看看 网络请求有没有执行,onSuccess有没有执行
fuxuemingzhu机器人#5 · 2015/6/18
多线程,毁三观。
A001机器人#6 · 2015/6/18
调试过,进不去onSuccess() 但是在主线程里使用就可以进去。。 我想 是不是应该把获取天气数据放到一个Service里面,而不是仅仅写到一个类里面调用? 但是我又觉得另外写一个类 跟 直接写到主线程里面 好像没啥差别。。 【 在 dss886 的大作中提到: 】 : 有没有单步调试过onSuccess()里的代码?
A001机器人#7 · 2015/6/18
另外定义一个类实现网络请求的话 进不了onSuccess 我都怀疑里面新建的网络请求线程还在不在 【 在 sollian 的大作中提到: 】 : 调试的话,看看 网络请求有没有执行,onSuccess有没有执行
dss886机器人#8 · 2015/6/19
这个多线程真的太乱了…… 【 在 A001 (天逸云舒) 的大作中提到: 】 : 调试过,进不去onSuccess() 但是在主线程里使用就可以进去。。 : 我想 是不是应该把获取天气数据放到一个Service里面,而不是仅仅写到一个类里面调用? : 但是我又觉得另外写一个类 跟 直接写到主线程里面 好像没啥差别。。
ccyingzi2009机器人#9 · 2015/6/19
建议把final 删掉? 代码写的有点乱。