Проблема с растровым изображением Android - PullRequest
0 голосов
/ 26 декабря 2011

Я хочу знать, как работает Android при создании растрового изображения из stream/file/byte. Я использую реализацию View Flow в своем приложении, где я заполняю изображения с SDCard, используя базу данных. Все работает нормально, но после нескольких ударов мое приложение FC из-за OutOfMemoryError. Я пробовал все через интернет, но ничто не помогает мне. Вот как я использую пример ViewFlow:

ImageAdapter.class:

 @Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.image_item, null);
    }

    try {
        File bufferFile = new File(ids.get(position));
        FileInputStream fis   = new FileInputStream(bufferFile);

        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        SecretKeySpec keySpec = new SecretKeySpec("asfadasdasd".getBytes(), "AES");
        IvParameterSpec ivSpec = new IvParameterSpec("cdsdfngfgbxfvbd".getBytes());
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
        CipherInputStream cis = new CipherInputStream(fis, cipher);

        Log.e("","HEAP SIZE "+Debug.getNativeHeapAllocatedSize());

        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inTempStorage = new byte[2*1024];
        o.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared

        Bitmap ops = BitmapFactory.decodeStream(cis,null,o);

        ((ImageView) convertView.findViewById(R.id.imgView)).setImageBitmap(ops);
        ops = null;
        cis.close();
        fis.close();
        System.gc();

    } catch (Exception e) {
        e.printStackTrace();
        ((ImageView) convertView.findViewById(R.id.imgView)).setImageResource(R.drawable.image_unavailablee);
    }

    return convertView;
}

Cards.class:

        // this is how I initialize viewFlow
        viewFlow = (ViewFlow) findViewById(R.id.viewflow);
        viewFlow.setAdapter(new ImageAdapter(this.getApplicationContext(), images), position);

Я устанавливаю sideBuffer на 1, и каждый раз, когда я переключаю изображения, я вижу, как растет мой размер кучи.

Итак, мой вопрос: как я могу предотвратить увеличение размера кучи и не получить это OOM Exception.

Заранее спасибо!

...