2012-12-31 90 views
0

我是初學者到android。我想在我的應用程序中使用內存緩存將圖像存儲在內存緩存中,並在這些圖像不需要緩存時將其清除!任何幫助將不勝感激。如何實現內存緩存?

+0

我試過用磁盤緩存。 ViewPager沒有從磁盤緩存中正確地選取圖像。但它從內存緩存確實已經嘗試了這些事情[處理BitMP的關閉Ui線程](http://developer.android.com/training/displaying-bitmaps/process-bitmap.html)和[緩存位圖](HTTP ://developer.android.com/training/displaying-bitmaps/cache-bitmap.html)但由於我是初學者,我沒有正確使用它,所以應用程序仍然崩潰與OutOfMemory。你能幫我處理位圖關閉UI線程與內存緩存?提前致謝! – Manoj

回答

0

您可以使用WeakHashMap來實現簡單的緩存方法。它的元素將被垃圾收集,所以如果你的應用程序使用它的堆,那麼它將被釋放,但直到你可以在內存中擁有這些圖像。

+0

謝謝@AndrásKerekes!你可以導致一些教程?如果我必須將其與ViewPager一起使用,該怎麼辦?這會有效嗎?我有大約36個圖像,分辨率大約在1280X800。應用程序崩潰在XHDPI設備上說OutOfMemory error.VM不會讓你允許分配一些字節的內存! – Manoj

+0

不幸的是,我沒有那麼多Android,所以我不知道這與ViewPager如何工作。我建議你的解決方案是一個相當普遍的解決方案。您可以定義一個WeakHashMap並將其顯示爲顯示圖像的視圖。當你需要一個圖像時,你首先檢查tha map,如果沒有,則加載圖像並放入hashmap中。如果以後你需要相同的圖像(並且GC沒有清理它),則可以從地圖訪問它。 –

0

請使用下面的代碼,並讓我知道。

public class MyApplication extends Application { 
    private static MyApplication instance; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     instance = this; 
    } 

    public static MyApplication getInstance() { 
     return instance; 
    } 

    public void clearApplicationData() { 
     File cache = getCacheDir(); 
     File appDir = new File(cache.getParent()); 
     if (appDir.exists()) { 
      String[] children = appDir.list(); 
      for (String s : children) { 
       if (!s.equals("lib")) { 
        deleteDir(new File(appDir, s)); 
        Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************"); 
       } 
      } 
     } 
    } 

    public static boolean deleteDir(File dir) { 
     if (dir != null && dir.isDirectory()) { 
      String[] children = dir.list(); 
      for (int i = 0; i < children.length; i++) { 
       boolean success = deleteDir(new File(dir, children[i])); 
       if (!success) { 
        return false; 
       } 
      } 
     } 

     return dir.delete(); 
    } 
} 
+0

我嘗試過使用磁盤緩存。 ViewPager不從磁盤緩存中選取圖像。但它從內存緩存確實已經嘗試了這些事情[處理BitMP的關閉Ui線程](http://developer.android.com/training/displaying-bitmaps/process-bitmap.html)和[緩存位圖](HTTP ://developer.android.com/training/displaying-bitmaps/cache-bitmap.html)但由於我是初學者,我沒有正確使用它,所以應用程序仍然崩潰與OutOfMemory。你能幫我處理位圖關閉UI線程與內存緩存?提前致謝! – Manoj

0

內存緩存是java的功能,而不是Android的功能。

進口的java.util。*

然後用列表,地圖,ArrayList和HashMap來建立內存映射對象的名稱/值配對的數組並將其存儲爲一個HashMap中。然後您可以通過散列映射訪問(讀取/刪除/更新)內存中的對象。

如果您需要爲將來的實例化(例如,通過應用程序停止和啓動)保存內存對象,那麼您只需要將數據寫入外部存儲器(大概是圖像和全部),然後再次讀取需要。

但是,在大多數情況下,您正在構建本地內存緩存,因爲您剛剛檢索了數據並希望其他類可以現在或在不久的將來處理它。如果應用程序因爲重新啓動而找不到數據,或者由於內存限制而不再位於內存中,則最好再次檢索數據,而不要依賴潛在的過期緩存文件。