0

我正在开发的 Andriod 应用程序使用 Http Gets/Posts 在我的网站上使用 PHP 文件在 mysql 数据库上执行事务。

在 PHP 方面,我使用 JSON 包装数据,以便在收到响应时在应用程序的 java 端进行解析。我最近修改了其中一张表,并从表中删除了不必要的值。当我使用我网站上的 PHP 脚本进行轮询时,它会正确轮询。当我使用使用相同 PHP 脚本进行轮询的应用程序时,它会返回我已经从数据库中删除的附加值。

我重新启动了 Eclipse,清理了项目,并重新启动了 android VDM 以刷新它;但是,它会继续查找那些被删除的值。关于发生了什么的任何想法?

这是我从应用程序连接到的 php 脚本:

<?php
mysql_connect("localhost", "******", "******");
mysql_select_db("bouncet2_pogoapp");

$query = "SELECT * FROM Event_Table ORDER BY Event ASC";
$sql = mysql_query($query);

while($row=mysql_fetch_assoc($sql))
$output[]=$row;

print(json_encode($output));

mysql_close();
?>

至于我在应用程序中使用脚本的代码:

try {
        String response = CustomHttpClient.executeHttpGet("http://www.*****.com/****/****/***/GetEvents.php");
        //System.out.println(response);

        try {
            eventArray = new JSONArray(response);
            //Log.i(SelectEventActivity.class.getName(), "Number of entries " + eventArray.length());

            m_adapterForSpinner = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
            m_adapterForSpinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

            event_Spinner.setAdapter(m_adapterForSpinner);          

            for (int i = 0; i < eventArray.length(); i++) {
                JSONObject jsonObject = eventArray.getJSONObject(i);
                m_adapterForSpinner.add(jsonObject.getString("Event"));
                //Log.i(AddJumpersActivity.class.getName(), jsonObject.getString("Event"));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }           
    } catch (Exception e) {
        e.printStackTrace();
    }

函数 executeHttpGet(URL) 是 CustomHttpClient 类的一部分,如下所示:

public static String executeHttpGet(String url) throws Exception {

    StringBuilder builder = new StringBuilder();
    HttpClient client = getHttpClient();
    HttpGet request = new HttpGet();
    request.setURI(new URI(url));

    try {            
        HttpResponse response = client.execute(request);
        StatusLine statusLine = response.getStatusLine();
        int statusCode = statusLine.getStatusCode();

        if (statusCode == 200) {
            Log.i(CustomHttpClient.class.toString(), "System Status OK");
            HttpEntity entity = response.getEntity();
            InputStream content = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(content));
            String line;
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }
        } else {
            Log.e(CustomHttpClient.class.toString(), "Failed to download file");
        } 
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return builder.toString();            
}
4

1 回答 1

1

看起来您的响应被缓存在某处,以太在手机和服务器之间的缓存服务器中,或者在手机本身中。

如果缓存发生在手机之外,添加适当的标头来禁用缓存就可以了。这将由服务器添加到响应的标头中。有几种方法可以做到这一点,但我认为这应该工作......

header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");

在电话端,根据您从 getHttpClient 获得的 HTTP 客户端,它可能是打开了缓存的客户端。在 Ice Cream Sandwich 中,Google 将缓存添加到 HttpURLConnection HTTP 客户端。根据文档,必须打开缓存,但许多人似乎在他们不知道的情况下遇到了缓存打开的问题。我不熟悉 Android 上各种 HTTP 客户端的互通,但这应该是一个好的开始......

http://developer.android.com/reference/java/net/HttpURLConnection.html

快速而肮脏的检查以查看是否有东西在缓存响应是在调用服务器时向您的 URL 添加一个随机的、未使用的参数,例如......

url += "?unused=" + UUID.randomUUID();

有了这个,您不应该在任何地方缓存,然后您至少可以确定它是缓存问题还是其他问题,然后从那里开始。

于 2012-07-07T00:32:27.923 回答