1

リストビューの項目をクリックすると、sdcard から画像が取得され、LRUCache に保存されます。画像は 750*580 の 400kb サイズです。しかし、キャッシュからビットマップを取得している間、ビットマップは null です。

ここに私のコードがあります: ここで lv はリストビューで、showpicture は初めて SD カードからビットマップを取得する方法です。

    private LruCache<String, Bitmap> mMemoryCache;
    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            int memClassBytes = am.getMemoryClass() * 1024 * 1024;
            int cacheSize = memClassBytes / 8;

     mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
                @Override
                protected int sizeOf(String key, Bitmap bitmap) {
                    // The cache size will be measured in kilobytes rather than
                    // number of items.
                    return bitmap.getRowBytes() * bitmap.getHeight();

                }
            };


    lv.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                if (!items.get(position).isSection()) {


                    EntryItem item = (EntryItem)items.get(position);

                    synchronized(mMemoryCache) {
                        lBitmap = mMemoryCache.get(item.getHallID());

                        if(lBitmap!=null){
                        vss.setImageBitmap(lBitmap);
                        Log.d("From cache", "from cache");
                        }
                    }

                    if(mMemoryCache.get(item.getHallID())==null){


                     hallimg = showPicture(Environment.getExternalStorageDirectory()
                    .getAbsolutePath()
                    + "/MLPA_VENUE/"
                    + item.getVenuename(), item.getSeatPlanImg(),item.getHallID());
                     Log.d("From not cache", "from not cache");
                     vss.setImageBitmap(hallimg);


                    }

///Below method to get bitmap from sdcard and to store in cache.

    public Bitmap showPicture(String path, String fileName,String hallID) {
        File f = new File(path, fileName);
        FileInputStream is = null;
        try {
            is = new FileInputStream(f);
        } catch (FileNotFoundException e) {
            Log.d("error: ", String.format(
                    "ShowPicture.java file[%s]Not Found", fileName));
            return null;
        }

        BitmapFactory.Options opt = new BitmapFactory.Options();
        opt.inMutable = true;
        opt.inPurgeable=true;
        opt.inInputShareable=true;
        opt.inDither=true;
        opt.inTempStorage=new byte[32*1024];
        if(bm!=null){
            bm.recycle();
        }
         bm = BitmapFactory.decodeStream(is, null, opt);
        synchronized (mMemoryCache) {

            mMemoryCache.put(hallID, bm);
           }
        return bm;
    }
4

0 に答える 0