0

私が開発している Andriod アプリは、Web サイトで PHP ファイルを使用して Http Gets/Posts を使用し、mysql データベースでトランザクションを実行しています。

PHP 側では、データを JSON でラップして、応答を受信したときにアプリケーションの Java 側で解析します。最近、テーブルの 1 つを変更し、テーブルから不要な値を削除しました。Web サイトから 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 に答える