1

私のアプリケーションでは、情報を含むURLをjsonに取得します。このjsonを電話に保存してから、電話がURLの電話と同じかどうかjsonを使用します。jsonを変更する場合は、jsonを再度ダウンロードする必要があります。

jsonを復元してオブジェクトを読み取りますが、jsonを電話のメモリに保持し、jsonを使用して、データを保存するために再度ダウンロードしないようにします。

手伝ってくれませんか。

一例:

public void affichage_phenomene(final String id_phenomene)
{
    if(id_phenomene.length()==0)
        return;

    mProgressDialog = ProgressDialog.show(this, "Patientez","Chargement...", true);

    new Thread((new Runnable()
    {
        public void run()
        {
            try
            {
                JSONArray jsonArray = Json.getJsonByUrl(page_Json); // On récupère un tableau contenant les éléments json           
                JSONObject jsonObject = jsonArray.getJSONObject(0);
                listItem2 = new ArrayList<HashMap<String, String>>();

                map.put("titre", jsonObject.getString("nom"));
                map.put("description", jsonObject.getString("description"));
                map.put("liens", jsonObject.getString("liens"));
                map.put("note_moyenne", jsonObject.getString("note_moyenne"));
                map.put("img",LoadPicture.loadImageFromWebOperations(getString(R.string.URL_Images)+jsonObject.getString("image"),"/sdcard/MysticWay/phenomene_"+idphenomene+".jpg"));
                JSONArray liste_lieux = jsonObject.getJSONArray("lieux");
                nombre_de_lieux = liste_lieux.length();
                if(nombre_de_lieux>0)
                {

                    for(int i = 0;i<nombre_de_lieux;i++)
                    {
                        map3 = new HashMap<String, String>();
                        JSONObject lieucible = liste_lieux.getJSONObject(i);
                        map3.put("idlieu", lieucible.getString("idlieuxspirituels"));
                        map3.put("nomlieu", lieucible.getString("nom_lieux"));
                        map3.put("adresse", lieucible.getString("adresse_lieux"));
                        map3.put("img", LoadPicture.loadImageFromWebOperations(getString(R.string.URL_Images)+lieucible.getString("image"),"/sdcard/MysticWay/icon_lieu_"+lieucible.getString("idlieuxspirituels")+".jpg"));
                        listItem2.add(map3);
                    }
                }
                handler.sendEmptyMessage(0);
                return;
            }
            catch (Exception e)
            {
                e.printStackTrace();
                handler.sendEmptyMessage(1);
                return;
            }
        }
    })).start();
}

private Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        if(msg.what == 0)
        {
            // Si le transfert c'est bien exécuté
            mProgressDialog.dismiss();
            Titre.setText(map.get("titre"));
            Description.setText(Html.fromHtml(map.get("description")));
            Lien.setText(map.get("liens"));
            note.setText(map.get("note_moyenne"));
            if(nombre_de_lieux==1)
            {
                View_Fiche_Phenomene.this.liste_lieux.setText(nombre_de_lieux+" lieu est associé à ce phénomène.");
                liste_lieux.setEnabled(true);
            }
            else if (nombre_de_lieux>1)
            {
                View_Fiche_Phenomene.this.liste_lieux.setText(nombre_de_lieux+" lieux sont associés à ce phénomène.");
                liste_lieux.setEnabled(true);
            }

            Intent checkIntent = new Intent();
            checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
            startActivityForResult(checkIntent, 0);
            if (map.get("img") == null)
                Image.setImageResource(R.drawable.noimage);
            else
                Image.setImageDrawable(Drawable.createFromPath(map.get("img")));

            if(Float.parseFloat(map.get("note_moyenne"))== 5)//img 5
                notemoyenne.setImageResource(R.drawable.etoile_5);
            else if (Float.parseFloat(map.get("note_moyenne"))<5 && Float.parseFloat(map.get("note_moyenne")) > 4)//img 4.5
                notemoyenne.setImageResource(R.drawable.etoile_4_5);
            else if (Float.parseFloat(map.get("note_moyenne")) == 4)//img 4
                notemoyenne.setImageResource(R.drawable.etoile_4);
            else if (Float.parseFloat(map.get("note_moyenne"))<4 && Float.parseFloat(map.get("note_moyenne")) > 3)//img 3.5
                notemoyenne.setImageResource(R.drawable.etoile_3_5);
            else if (Float.parseFloat(map.get("note_moyenne")) == 3)//img 3
                notemoyenne.setImageResource(R.drawable.etoile_3);
            else if (Float.parseFloat(map.get("note_moyenne"))<3 && Float.parseFloat(map.get("note_moyenne")) > 2)//img 2.5
                notemoyenne.setImageResource(R.drawable.etoile_2_5);
            else if (Float.parseFloat(map.get("note_moyenne")) == 2)//img 2
                notemoyenne.setImageResource(R.drawable.etoile_2);
            else if (Float.parseFloat(map.get("note_moyenne"))<2 && Float.parseFloat(map.get("note_moyenne")) > 1)//img 1.5
                notemoyenne.setImageResource(R.drawable.etoile_1_5);
            else if (Float.parseFloat(map.get("note_moyenne")) == 1)//img 1
                notemoyenne.setImageResource(R.drawable.etoile_1);
            else if (Float.parseFloat(map.get("note_moyenne"))<1 && Float.parseFloat(map.get("note_moyenne")) > 0)//img 0.5
                notemoyenne.setImageResource(R.drawable.etoile_0_5);
            //sinon img 0
        }
        if(msg.what == 1)
        {
            // Erreur : réseau ou autre
            mProgressDialog.dismiss();
            AlertDialog.Builder adb=new AlertDialog.Builder(mContext);
            adb.setTitle("Erreur");
            adb.setMessage("Impossible de comuniquer avec le serveur!");
            adb.setPositiveButton("Ok", null);
            adb.show();
        }
    };
};
4

2 に答える 2

1

Sqlite db を使用して結果を保存することは素晴らしいアイデアです。データが変更されたかどうかを確認するには、いくつかの方法があります。結果が最後に変更された時刻を含めることができる Last-Modified ヘッダーをサーバー側に追加できます。Last-Modified 時刻が JSON リクエストを最後に取得した時刻と同じ場合 (Sqlite DB で確認できます)、リクエストの本文をダウンロードする必要はありません。

タイムスタンプを追跡したくない場合 (これが最善の方法ですが)、別の方法として、MD5 ハッシュ、SHA1、またはリソースの負荷が最も少ないものを追跡することができます。次に、ハッシュを HTTP ヘッダーに入れることができます。ハッシュが Sqlite db に保存したものと一致する場合は、コンテンツをダウンロードする必要はありません。サーバー側で暗号化を行うには (時間とリソースの両方の点で) コストがかかるため、これはネットワークを通過する大量の JSON データでのみ役立ちます。

于 2012-05-28T15:29:28.730 に答える
1

ダウンロード時にデータを Sqlite db に保存します。次に、好きなように操作したり、特定の行を更新したりできます。

于 2012-05-01T16:28:14.697 に答える