2015-07-19 68 views
0

我想在缓存中设置JSon数据以便脱机使用并减少加载时间。 所以,我做了一个的AsyncTask这条信息:How to Cache Json data to be available offline?Android - 缓存中的JSON ListView

我的应用程序在离线文件(我想是因为我已经在缓存中的数据)存储数据,但它不解析它,当我重新加载应用程序。因此,当我重新加载应用程序时,它从互联网而不是缓存文件重新分析数据。 所以我希望应用程序使用缓存解析旧数据,并查看是否有新的数据从URL下载。

这是我的代码:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    /* Navigation Sample */ 
    toolbar = (Toolbar) findViewById(R.id.tool_bar); 
    setSupportActionBar(toolbar); 
    mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView); // Assigning the RecyclerView Object to the xml View 
    mRecyclerView.setHasFixedSize(true);       // Letting the system know that the list objects are of fixed size 
    mAdapter = new MyAdapter(TITLES,ICONS,NAME,EMAIL,PROFILE);  // Creating the Adapter of MyAdapter class(which we are going to see in a bit) 
    mRecyclerView.setAdapter(mAdapter);        // Setting the adapter to RecyclerView 
    mLayoutManager = new LinearLayoutManager(this);     // Creating a layout Manager 
    mRecyclerView.setLayoutManager(mLayoutManager);     // Setting the layout Manager 
    Drawer = (DrawerLayout) findViewById(R.id.DrawerLayout);  // Drawer object Assigned to the view 
    mDrawerToggle = new ActionBarDrawerToggle(this,Drawer,toolbar,R.string.openDrawer,R.string.closeDrawer){ 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      // code here will execute once the drawer is opened(As I dont want anything happened whe drawer is 
      // open I am not going to put anything here) 
     } 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
      // Code here will execute once drawer is closed 
     } 
    }; // Drawer Toggle Object Made 
    Drawer.setDrawerListener(mDrawerToggle); // Drawer Listener set to the Drawer toggle 
    mDrawerToggle.syncState();    // Finally we set the drawer toggle sync State 




    // My App 

    mListView = (ListView) findViewById(list1); 
    imagearticle = (ImageView) findViewById(R.id.imagearticleaccueil); 

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 

    new TheTask().execute(); 
    } 

    class TheTask extends AsyncTask<Void, Void, JSONArray> { 
     ProgressDialog pd; 

     @Override 
     protected void onPostExecute(JSONArray result) { 
      super.onPostExecute(result); 
      pd.dismiss(); 

      Log.i("4", "ok"); 
      try 
      { 
       Log.i("5", "ok"); 
       for(int i=0;i<result.length();i++) 
       { 
        json_data = result.getJSONObject(i); 
        try { 
         URL imageURL = new URL("http://" + json_data.getString("article_thumbnail")); 
         HttpURLConnection connection = (HttpURLConnection) imageURL.openConnection(); 
         InputStream inputStream = connection.getInputStream(); 
         bitmap = BitmapFactory.decodeStream(inputStream); 

         Log.i("6", "ok"); 

        } catch (MalformedURLException e) { 
         Log.i("chargementimage", "" + e.toString()); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

        HashMap<String,Object> temp=new HashMap<String, Object>(); 
        temp.put("id", json_data.getString("article_id")); 
        temp.put("picture", bitmap); 
        temp.put("nom", json_data.getString("article_title").replaceAll("&#039;", "'")); 
        temp.put("client", json_data.getString("username")); 
        donnees.add(temp); 

        Log.i("7", "ok"); 

       } 

       Log.i("8", "ok"); 
       adapter = new SimpleAdapter(getBaseContext(),donnees, 
         R.layout.list_article,new String[]{"picture", "nom","client"},new int[] {R.id.imagearticleaccueil, R.id.nom, R.id.client}); 
       adapter.setViewBinder(new MyViewBinder()); 

       mListView.setAdapter(adapter); 

       Log.i("9", "ok"); 

      } 
      catch(JSONException e){ 
       Log.i("tagjsonexp", "" + e.toString()); 
      } 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pd = ProgressDialog.show(MainActivity.this, "State", 
        "Loading...", true); 
     } 

     @Override 
     protected JSONArray doInBackground(Void... arg0) { 

      try { 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(strURL); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 
      } catch (Exception e) { 
       Log.e("log_tag", "Error in http connection " + e.toString()); 
      } 

      // Convert response to string 
      try { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8")); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 
       while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
       is.close(); 
       result = sb.toString(); 
       writeToFile(result); 

       Log.i("1", "ok"); 
      } catch (Exception e) { 
       Log.e("log_tag", "Error converting result " + e.toString()); 
      } 

      try { 
       jArray = new JSONArray(result); 
       Log.i("2", "ok"); 
      } catch (JSONException e) { 
       Log.e("log_tag", "Error parsing data " + e.toString()); 
      } 

      try { 
       jArray = new JSONArray(readFromFile()); 
       Log.i("3", "ok"); 
      } catch (JSONException e) { 
       Log.e("log_tag", "Error parsing data " + e.toString()); 
      } 
      return jArray; 
     } 
    } 

private void writeToFile(String data) { 
    try { 
     OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput("config.txt", Context.MODE_PRIVATE)); 
     outputStreamWriter.write(data); 
     outputStreamWriter.close(); 
    } 
    catch (IOException e) { 
     Log.e("Exception", "File write failed: " + e.toString()); 
    } 
} 

private String readFromFile() { 

    String ret = ""; 

    try { 
     InputStream inputStream = openFileInput("config.txt"); 

     if (inputStream != null) { 
      InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
      String receiveString = ""; 
      StringBuilder stringBuilder = new StringBuilder(); 

      while ((receiveString = bufferedReader.readLine()) != null) { 
       stringBuilder.append(receiveString); 
      } 

      inputStream.close(); 
      ret = stringBuilder.toString(); 
     } 
    } catch (FileNotFoundException e) { 
     Log.e("login activity", "File not found: " + e.toString()); 
    } catch (IOException e) { 
     Log.e("login activity", "Can not read file: " + e.toString()); 
    } 

    return ret; 
} 

感谢

+0

检查doInBackground()。它具有1.“从网上读取”2.“写入缓存”3.“从缓存中读取”..但是没有“检查缓存的存在并从中读取”代码1.(此评论中的数字不相同在你的代码中) – Toris

+0

请问你能帮我做这个吗?谢谢 – Dave1111

回答

1

我没有测试,但是这可能工作。 对不起,缩进。


@Override 
    protected JSONArray doInBackground(Void... arg0) { 

    // result is used as String but not defined in doInBackground() ... 

    // Load from cache 
    String result = readFromFile(); 

    // If cache is empty, load from web 
    if ("".equals(result)) 
    { 
     // COPY from original code BEGIN 
     try { 
      HttpClient httpclient = new DefaultHttpClient(); 
     .... 
      result = sb.toString(); 
      writeToFile(result); 

      Log.i("1", "ok"); 
     } catch (Exception e) { 
      Log.e("log_tag", "Error converting result " + e.toString()); 
     } 
     // COPY from original code END 
    } // end of if ("".equals(result)) 

     try { 
      jArray = new JSONArray(result); 
      Log.i("2", "ok"); 
     } catch (JSONException e) { 
      Log.e("log_tag", "Error parsing data " + e.toString()); 
     } 

     /* 
     // We already got jArray. 
     try { 
      jArray = new JSONArray(readFromFile()); 
      Log.i("3", "ok"); 
     } catch (JSONException e) { 
      Log.e("log_tag", "Error parsing data " + e.toString()); 
     } 
     */ 

     return jArray; 
    } // end of doInBackground() 
+0

谢谢你的工作,但如果我想更新我的Json添加文章。我需要比较json和'readFromFile()'?以及如何比较只有最后一篇文章不刷新所有文章(长时间加载)。谢谢 – Dave1111

+0

检查时间戳或ETag(或散列)。它取决于服务器将返回的标题。 – Toris

+0

这可能有帮助。 http://stackoverflow.com/questions/7095897/im-trying-to-use-javas-httpurlconnection-to-do-a-conditional-get-but-i-neve – Toris