2

現在、Android アプリケーションに問題があり、サーバーをオンラインにしてアプリを実行し、[戻る] ボタンでアプリを閉じ、サーバーをオフにしてからアプリを再度起動すると、json 応答が記憶されます。 . アプリを強制終了し、サーバーをオフにして再度実行すると、json 応答がありません。この応答はどこにキャッシュされていますか? この応答を受信するためにインスタンス メソッドを介して呼び出していますが、なぜこれが起こっているのかわかりません。アプリにこの応答を記憶させないようにするにはどうすればよいですか?

私の活動では:

    uFunctions = new JSONFunctions();
    JSONObject json = null;
    System.out.println(json); // Returns null
    json = uFunctions.getJson(uid);
    System.out.println(json); //Returns the json after the request was completed
    //successfully even if the server is offline afterwards.

JSON関数:

public class JSONFunctions{

    public JSONFunctions(){
        jParser = new jParser();
    }

    public JSONObject getJson(String uid){
        List<NameValuePair> param = new ArrayList<NameValuePair>();
        param.add(new BasicNameValuePair("tag", "request");
        param.add(new BasicNameValuePair("id", uid);
        JSONObject json = jParser.getJsonFromUrl(url, param);
        return json;
    }
}

jParser:

public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
        Log.e("JSON", json);
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);            
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}
4

3 に答える 3

0

私はあなたと同様の問題を抱えていました。HTTP リクエストを介して JSON 文字列を出力する Android アプリケーション用の RESTful Web サービスがありました。JSON 出力は、Android アプリケーションによってキャッシュされています。私の場合:

  1. Web サービスへのリクエストが行われ、JSON 文字列が正常に受信されます。
  2. Web サービスをオフにしました。
  3. No.1 と同じ Web サービスへの別の要求が、Web サービスに対して 2 回目に行われます。今回は、要求された JSON 文字列が Web サービスによって返されてはなりません。そのため、Android アプリケーションは JSON 文字列の解析中にエラーを表示します。しかし、アンドロイド httpClient は明らかに以前の JSON 文字列を返します。したがって、これはキャッシングの問題であるに違いないと思います。

私は2つのステップで問題を解決しました:

  1. Android の設定からアプリケーションのキャッシュ データをすべて削除 | アプリメニュー
  2. 出力の前に、Web サービス スクリプトで次のヘッダーを送信します。

    Cache-Control: no-cache, must-revalidate-- キャッシュ ヘッダーなし
    Expires: Sat, 26 Jul 1997 05:00:00 GMT-- 過去の日付で期限切れ

    私の場合は、次のような PHP コードで記述されていました。

    <?php
    header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
    ?>

于 2013-02-27T00:01:53.497 に答える
0

戻るボタンでアプリを終了すると、システムはアプリをバックグラウンドに置くだけです。したがって、onCreate でメモリに割り当てられた値が記憶され、アプリは onResume から引き続き実行されます。

ただし、アプリを強制終了すると、アプリは破棄され、そのすべてのアクティビティがアクティビティ スタックから削除されます。このシナリオでは、JSON 応答も削除され、サーバーがオフラインであるため、アプリが再度開始されて onCreate が呼び出されたときに、そこから応答を取得できません。

アクティビティのライフサイクルに関するドキュメント。 活動記録

于 2012-12-20T08:42:15.977 に答える
0

HTTP 応答はシステムにキャッシュされます。Jayp が指摘したように、戻るボタンは必ずしもアプリをメモリからフラッシュするとは限らないため、キャッシュされた応答はまだそこにあります。

Apache ライブラリを使用している場合は、http 要求オブジェクトでキャッシュを無効にします。

  request.setHeader("Cache-Control", "no-cache");

これでうまくいくはずです。Java.net の場合、URLConnection でキャッシュを無効にすると思います。

  conn.setUseCaches(false);

しかし、私はまだ実際に試していません。

于 2013-02-27T00:42:31.557 に答える