Java 安卓:应用在WiFi上工作,但既不在3G上也不在2G上

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

我迫切需要帮助解决这个问题。我知道在这些方面已经有问题了,但没有一个问题与我目前面临的问题完全相同

我有一个应用程序可以从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");
    }
因此,当我使用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所建议)

很明显,这里存在缓存问题。由于wifi上一切正常,我认为问题可能来自网络提供商基础设施中的缓存。您的请求是一个GET,它可以很容易地被路径上的任何元素缓存。要解决这个问题,你可以

  • 配置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
      再次检索数据?哦,不。我有一个刷新,但是