我迫切需要帮助解决这个问题。我知道这些问题已经存在问题,但它们都不像我现在面临的问题。
我有一个应用程序从URL中提取以下JSON数据:
{
"dateToday" = "17th May"
}
检索该数据的代码如下:
protected List<String> doInBackground(List<String>... arg0) {
Log.d("Refresh Check","In background...");
// TODO Auto-generated method stub
List<String> matchDetails = new ArrayList<String>();
try {
Log.d("Refresh Check","In try...");
json = jsonData.retrieveData(URL, client);
Log.d("Refresh Check",json.toString());
String date = json.getString("dateToday");
matchDetails.add(date);
return matchDetails;
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return Arrays.asList("Connectivity issue");
}
检索数据功能是:
public JSONObject retrieveData(String URL, HttpClient client)
throws ClientProtocolException, IOException, JSONException {
StringBuilder url = new StringBuilder(URL);
HttpGet get = new HttpGet(url.toString());
HttpResponse r = client.execute(get);
int status = r.getStatusLine().getStatusCode();
if (status == 200) {
HttpEntity e = r.getEntity();
String data = EntityUtils.toString(e);
JSONObject last = new JSONObject(data);
return last;
} else {
return null;
}
}
因此,当我使用WiFi在手机上运行时,一切正常并且可以完美更新,但是当我在3G或2G上切换到我的数据计划时,数据根本不会刷新。
我的代码中的第3个Log.d检查String,即使我将JSON值更改为18,也会将日期保持为5月17日。
我可以注意到的logcat与我的数据计划的唯一区别是数据计划在网络控制器:iconLevel&gt; = 5
的行上有错误虽然这里很烦人,但有时候应用程序即使在2G上工作也完全没问题,它就像它已经工作了一段时间,然后说我从2G切换到WiFi,然后回到2G,它的工作原理。应用程序的行为非常不稳定。
到目前为止我尝试过的事情:
1。)使用另一部手机查看问题是否仍然存在(确实如此)。
2.)检查我的手机浏览器是否可以访问该URL并显示更新的结果(可能)。
因此,我现在无能为力,并且在经过3个星期的无法解释的执行后真的接近放弃应用程序。
如果有人可以提供帮助,我会非常非常感激。 这就是我现在缩小的范围:
1。)为什么从WiFi和3G / 2G上获取来自特定URL的轻量级数据的行为会有所不同
2。)android是否将数据保存到缓存或其他什么?因为每次启动应用程序时,都应该到达doInBackground,其中应该从站点检索更新的数据,但日志只显示旧数据。
3。)如果我尝试将apk单独加载到我的设备而不是通过eclipse在手机上运行它会有帮助吗?我的意思是,两者之间有什么区别吗?
任何帮助都会非常感激。提前谢谢。
答案 0 :(得分:3)
当您从服务器请求json数据时,它可能是缓存。
当您从服务器请求数据时,您可以尝试在网址后面添加timestamp
字符串,以确保请求是一个新请求以避免缓存
例如:
原始网址:mytest.com/webservice/?date=today
添加额外参数:mytest.com/webservice/?date=today×tamp=ddmmyyhhmmss
答案 1 :(得分:1)
你显然有一个缓存问题。由于wifi上的一切运行良好,我认为问题可能来自网络提供商基础设施中的缓存。您的请求是GET,它可以很容易地被路径上的任何元素缓存。要解决这个问题,你可以
Cache-Control
与no-cache
或max-age
或标头expire
)添加到您的请求的答案中(如何操作)这取决于您使用的http服务器)。实际上,它可能比这更棘手,请参阅维基百科上的section以避免避免缓存。答案 2 :(得分:1)
我为延迟回复此事而道歉。
Darkangle的建议似乎就是现实。
但是,我已经检查了stackoverflow上的缓存问题,并找到了一个适合我的解决方案。
这是对代码的更改:
StringBuilder url = new StringBuilder(URL);
HttpGet get = new HttpGet(url.toString());
get.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
get.setHeader("Pragma", "no-cache"); // HTTP 1.0.
HttpResponse response = client.execute(get);
get.setHeaders确保每次都获取新数据。
感谢所有帮助过的人。