2015-01-14 15 views
5

私はJSONを正常に解析しましたが、オフラインで使用するためにキャッシュしたい、インターネットが利用できない場合でも新しいエントリがあればキャッシュします。解析されたJSONをオフラインでキャッシュする方法

そして、データをキャッシュする最良のオプションは何でしょうか?

public class MainActivity extends Activity { 

    ArrayList<Actors> actorsList; 
    ActorAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     actorsList = new ArrayList<Actors>(); 
     new JSONAsyncTask().execute("http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors"); 

     ListView listview = (ListView)findViewById(R.id.list); 
     adapter = new ActorAdapter(getApplicationContext(), R.layout.row, actorsList); 

     listview.setAdapter(adapter); 

     listview.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int position, 
        long id) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getApplicationContext(), actorsList.get(position).getName(), Toast.LENGTH_LONG).show();    
      } 
     }); 
    } 


    class JSONAsyncTask extends AsyncTask<String, Void, Boolean> { 

     ProgressDialog dialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      dialog = new ProgressDialog(MainActivity.this); 
      dialog.setMessage("Loading, please wait"); 
      dialog.setTitle("Connecting server"); 
      dialog.show(); 
      dialog.setCancelable(false); 
     } 

     @Override 
     protected Boolean doInBackground(String... urls) { 
      try { 

       //------------------>> 
       HttpGet httppost = new HttpGet(urls[0]); 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpResponse response = httpclient.execute(httppost); 

       // StatusLine stat = response.getStatusLine(); 
       int status = response.getStatusLine().getStatusCode(); 

       if (status == 200) { 
        HttpEntity entity = response.getEntity(); 
        String data = EntityUtils.toString(entity); 


        JSONObject jsono = new JSONObject(data); 
        JSONArray jarray = jsono.getJSONArray("actors"); 

        for (int i = 0; i < jarray.length(); i++) { 
         JSONObject object = jarray.getJSONObject(i); 

         Actors actor = new Actors(); 

         actor.setName(object.getString("name")); 
         actor.setDescription(object.getString("description")); 

         actorsList.add(actor); 
        } 
        return true; 
       } 

       //------------------>> 

      } catch (ParseException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return false; 
     } 

     protected void onPostExecute(Boolean result) { 
      dialog.cancel(); 
      adapter.notifyDataSetChanged(); 
      if(result == false) 
       Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show(); 

     } 
    } 

} 
+1

ファイルに保存しますか? – Skynet

答えて

7

理由だけではなく、このようなものを使用して、あなたのアプリのキャッシュフォルダに保存しませんさて、ObjectToFileUtilという名前のクラスを作成し、このコードを作成したクラスに貼り付けます

package <yourpackagehere>; 

import android.os.Environment; 

import java.io.*; 

public class ObjectToFileUtil { 

    public static String objectToFile(Object object) throws IOException { 
     String path = Environment.getExternalStorageDirectory() + File.separator + "cache" + File.separator; 
     File dir = new File(path); 
     if (!dir.exists()) { 
      dir.mkdirs(); 
     } 
     path += "data"; 
     File data = new File(path); 
     if (!data.createNewFile()) { 
      data.delete(); 
      data.createNewFile(); 
     } 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data)); 
     objectOutputStream.writeObject(object); 
     objectOutputStream.close(); 
     return path; 
    } 

    public static Object objectFromFile(String path) throws IOException, ClassNotFoundException { 
     Object object = null; 
     File data = new File(path); 
     if(data.exists()) { 
      ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data)); 
      object = objectInputStream.readObject(); 
      objectInputStream.close(); 
     } 
     return object; 
    } 
} 

< yourpackagehere>をあなたのパッケージ名に変更してください。パッケージ名にAndroidManifest.xmlへの許可を忘れずに追加してください。今、あなたが欲しいとき

try { 
    actorsList = (ArrayList<Actors>)objectFromFile(dataPath); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 

を使用することにより、いつでもファイルからactorsListを取得するアクセスできますMainActivityでフィールド

private String dataPath; 

を追加し、

protected void onPostExecute(Boolean result) { 
    dialog.cancel(); 
    adapter.notifyDataSetChanged(); 
    if(result) { 
     try { 
      dataPath = objectToFile(arrayList); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show(); 
    } 
} 

にJSONAsyncTaskクラスのごonPostExecute方法を置き換えますアプリケーション終了後にファイルのパスを保存したい場合は、例えばSharedPreferencesを使用してdataPath文字列を保存し、アプリケーション起動時に読み込む必要があります。

+0

私はあなたの答えを読んで、ファイルの使用法を理解しました。あなたのコードを私のものと組み合わせることはできますか?..私はそれを試すか、github上のサンプルコードを持っていますか? – Sun

+0

それは面白いです。最初にOPNIONを求めました。次に、あなたがあなたのアプリで好きなやり方でそれを使うことができるように@doubledeathが必要な正しいコードを書いていますが、今でもあなたはまだ答えについて不平を言っています...¬¬ – PFROLIM

+0

@Sun check update above質問があります、私にここで教えてください。 – doubledeath

0
And what would be the best option to cache data ? SharedPreferences or SQLite database 

純粋にあなたが受信したデータに基づいています。ここではSharedPreferencesまたはSQLite database

は、私はJSONを解析するために使用しています私のコードです。

  1. データが小さく、非構造化データの場合は、Shared Prefを使用します。
  2. データが大きい場合、構造化データはSQLiteを使用します。

しかし、完全なデータを保存するには、file conceptを使用することができます。文字列データをコードString data = EntityUtils.toString(entity);dataに保存する必要があります。サーバーからのデータを変更すると、それをファイルに追加します。インターネットが存在しない場合は、データを取得します。上のリンクからファイル操作のサンプルコードを入手してください。

String path = Environment.getExternalStorageDirectory() + File.separator + "cache" + File.separator; 
File dir = new File(path); 
if (!dir.exists()) { 
    dir.mkdirs(); 
} 
path += "data"; 
File data = new File(path); 
if (!data.createNewFile()) { 
    data.delete(); 
    data.createNewFile(); 
} 
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data)); 
objectOutputStream.writeObject(actorsList); 
objectOutputStream.close(); 

以降

は、あなたが使用して、任意の時間でそれを読むことができます:

List<?> list = null; 
File data = new File(path); 
try { 
    if(data.exists()) { 
     ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data)); 
     list = (List<Object>) objectInputStream.readObject(); 
     objectInputStream.close(); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 

UPDATE:

関連する問題