Java 安卓:应用在WiFi上工作,但既不在3G上也不在2G上
我迫切需要帮助解决这个问题。我知道在这些方面已经有问题了,但没有一个问题与我目前面临的问题完全相同 我有一个应用程序可以从URL中提取以下JSON数据:Java 安卓:应用在WiFi上工作,但既不在3G上也不在2G上,java,android,Java,Android,我迫切需要帮助解决这个问题。我知道在这些方面已经有问题了,但没有一个问题与我目前面临的问题完全相同 我有一个应用程序可以从URL中提取以下JSON数据: { "dateToday" = "17th May" } 检索该数据的代码如下所示: protected List<String> doInBackground(List<String>... arg0) { Log.d("Refresh Check","In backgroun
{
"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");
}
因此,当我使用WiFi在手机上运行此功能时,一切都可以正常工作并得到完美更新,但当我切换到3G或2G数据计划时,数据根本不会刷新
我代码中的第三个Log.d检查字符串,即使我将JSON值更改为18,它也会一直返回日期为5月17日
我注意到WiFi的logcat与我的数据计划的唯一区别是数据计划在网络控制器:iconLevel>=5的线路上有一个错误
这就是它让人恼火的地方,有时候,即使在2G上,应用程序也可以完全正常工作,就像它暂时不能工作一样,然后说我从2G切换到WiFi,然后再切换到2G,它就可以工作了。该应用程序的行为一直非常不稳定
到目前为止我已经尝试过的事情:
1.)使用另一部电话查看问题是否仍然存在(确实存在)
2.)检查我的手机浏览器是否可以访问URL并显示更新的结果(它可以)
因此,我现在不知所措,在3周的不明原因的执行之后,我真的很快就要放弃这个应用了
如果有人能帮忙,我将非常感激这就是我现在所说的:
1.)为什么从特定URL获取轻量级数据在WiFi和3G/2G上的行为会有所不同
2.)android是否正在将数据保存到缓存中?因为每次我启动应用程序时,它都应该到达doInBackground,在那里,它应该从站点检索更新的数据,但日志只是显示旧数据
3.)如果我尝试将apk单独加载到我的设备上,而不是通过eclipse在手机上运行它,会有帮助吗?我是说,这两者有什么区别吗
任何帮助都将不胜感激。提前感谢。当您从服务器请求json数据时,可能是缓存问题 当您从服务器请求数据时,可以尝试在url后面添加一个
时间戳
字符串,以确保任何请求都是新请求,从而避免缓存
例如:
原始Url:mytest.com/webservice/?date=today
添加额外参数:
mytest.com/webservice/?date=today×tamp=ddmmyyhhmmss
当您从服务器请求json数据时,可能是缓存
当您从服务器请求数据时,可以尝试在url后面添加一个时间戳
字符串,以确保任何请求都是新请求,从而避免缓存
例如:
原始Url:mytest.com/webservice/?date=today
添加额外参数:
mytest.com/webservice/?date=today×tamp=ddmmyyhhmmss
很明显,这里存在缓存问题。由于wifi上一切正常,我认为问题可能来自网络提供商基础设施中的缓存。您的请求是一个GET,它可以很容易地被路径上的任何元素缓存。要解决这个问题,你可以
- 配置HTTP服务器以将缓存控制头(头
缓存控制
带
或无缓存
或头最大年龄
)添加到请求的答案中(如何操作取决于您使用的HTTP服务器)。事实上,这可能有点棘手,请参见维基百科上的“避免缓存”过期
- 向url添加一个随机参数(如@Darkangle所建议)
- 配置HTTP服务器以将缓存控制头(头
缓存控制
带
或无缓存
或头最大年龄
)添加到请求的答案中(如何操作取决于您使用的HTTP服务器)。事实上,这可能有点棘手,请参见维基百科上的“避免缓存”过期
- 向url添加一个随机参数(如@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确保每次提取新数据
感谢所有帮助过我的人。我很抱歉延迟回复 达康格尔的建议似乎恰到好处 然而,我已经检查了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确保每次提取新数据
感谢所有帮助过你的人。你什么时候检索这些数据?您是否使用
onDataConnectionStateChanged
再次检索数据?哦,不。我有一个刷新按钮,它调用异步任务。除此之外,我还使用处理程序进行了及时刷新。this.myHandler=新处理程序();this.myHandler.postDelayed(myRunnable,refreshTime);也许你的刷新并没有达到你想象的效果,但它是在WiFi上进行的。此外,我使用的Log.d确实告诉我,每次我点击refresh时,代码都会进入AsyncTask,但大多数时候它只是带回过时的数据,但随机地,它有时甚至可以完美地工作。您具体什么时候检索这些数据?您是否使用onDataConnectionStateChanged
再次检索数据?哦,不。我有一个刷新,但是