2014-08-25 3 views
1

Одна из особенностей библиотеки Volley для сетевых операций в android заключается в том, что она кэширует текст и изображения на диск, поэтому, изменяя ориентацию, приложение не должно загружать изображения и тексты снова. этот кусок кода использует эту функцию:Кэширование текста и изображений с использованием библиотеки Volley

public class AppsActivity extends Activity { 

static public Typeface font; 
List<Application> appsList; 
ArrayList<String> title = new ArrayList<String>(); 
ArrayList<String> description = new ArrayList<String>(); 
AppAdapter adapter; 
GridView gv; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_apps); 
    font =Typeface.createFromAsset(getAssets(), "fonts/BMitra.ttf"); 
    appsList = new ArrayList<Application>(); 
    gv = (GridView) findViewById(R.id.gridView1); 
    adapter = new AppAdapter(this, appsList); 
    gv.setAdapter(adapter); 
    Cache cache = AppController.getInstance().getRequestQueue().getCache(); 
    Entry entry = cache.get("http://appline.ir/index.php/android.feed?limitstart="); 
    if (entry != null) 
    { 
     fetch the data from cache 
     try { 
      String data = new String(entry.data, "UTF-8"); 
      parseXmlString(data); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 

    } 
    else 
    { 
     StringRequest request = new StringRequest(Method.GET, "http://appline.ir/index.php/android.feed?limitstart=", new Listener<String>() { 

      @Override 
      public void onResponse(String res) 
      { 
       parseXmlString(res); 
      } 

    gv.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, 
       int position, long arg3) { 
      Intent intent = new Intent(AppsActivity.this, 
        AppDetailActivity.class); 

      Application app; 
      app=appsList.get(position); 
      intent.putExtra("title", app.getTitle()); 
      intent.putExtra("imageUrl", app.getImageUrl()); 
      intent.putExtra("description", description.get(position+1)); 
      //    intent.putExtra("title", app.getTitle()); 

      startActivity(intent); 
     } 

    }); 

} 

public void parseXmlString(String string) 
{ 

    XmlPullParserFactory parser; 
    XmlPullParser xml = null; 

    try 
    { 
     parser =XmlPullParserFactory.newInstance(); 
     xml = parser.newPullParser(); 
     StringReader reader = new StringReader(string); 
     xml.setInput(reader); 
    } 
    catch(Exception e) 
    { 
     System.err.println(e.getMessage()); 
    } 

    int event; 
    String text = null; 
    try { 

     event = xml.getEventType(); 
     while (event != XmlPullParser.END_DOCUMENT) 
     { 
      String name=xml.getName(); 
      switch (event) 
      { 
      case XmlPullParser.START_TAG: 
       break; 
      case XmlPullParser.TEXT: 
       text = xml.getText(); 
       break; 
      case XmlPullParser.END_TAG: 
       if(name.equals("title")){ 
        title.add(text); 
       } 
       else if(name.equals("link")){ 
        //      link = text; 
       } 
       else if(name.equals("description")){ 

        description.add(text); 
       } 
       else{ 
       } 
       break; 
      }   
      event = xml.next(); 
     } 
    } 
    catch (Exception e) { 
     System.err.println(e.getMessage()); 
    } 
    System.out.println(description.size()); 
    for(int i = 1; i < description.size(); i++) 
    { 
     Document doc = Jsoup.parse((description.get(i))); 
     Elements links = doc.select("p"); // a with href 
     Elements pngs = links.select("img[src$=.png]"); 
     String image = pngs.attr("src"); 
     appsList.add(new Application(Html.fromHtml(title.get(i)).toString(), image, font)); 
    } 
    adapter.notifyDataSetChanged(); 
} 

Мой вопрос заключается в том, что, когда я отладки кода (с помощью System.out, если условие для кэша), я понял, что мы никогда не получить удар на кэш. что не так?

ответ

1

сервер доза не позволяет кэшировать эти файлы, для того, чтобы подтвердить свой ответ вы можете сделать одну из этих вещей:

  1. скачать этот плагин в (RESTClient) для Mozilla и отправить запрос и проверьте файл заголовка для управления кешем

  2. установить точку останова в headerValue = headers.get("Cache-Control"); на HttpHeaderParse класс и посмотреть, что происходит.

все эти решения только справедливо, если вы установите ваши запросы быть обналичиваемый shouldCache();

и только для того, чтобы принять мой ответ быстрее, посмотрите управления кэшем :-)

enter image description here

+0

снова посмотрите на мой ответ !! – mmlooloo

+0

tanx для ответа, есть ли все-таки переопределить политику кэширования? – Branky

+0

да два способа я знаю: измените 'parseCacheHeaders' из класса' HttpHeaderParser' или сохраните свой ответ в кэше запросов кэш-запросов по ключевым значениям URL-адресов. для изображения вы также должны добавить ширину и высоту, если вы используете networkimage. читать исходный код !!! – mmlooloo

Смежные вопросы