Android использует кеш для сохранения изображений - PullRequest
0 голосов
/ 03 августа 2011

Основная идея такова: я загружаю зашифрованный файл изображения из Интернета и начинаю расшифровывать его.

После того, как это сделано, я хочу сохранить его в кэш (если это лучший способ сделать то, чтоМне нужно), а затем загрузить его в виде списка отложенной загрузки.

Но сейчас я просто хочу проверить показанное изображение после расшифровки в ImageView.

Вот код, который я использую:

package com.android.basetableview;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.ImageView;

public class BaseTableViewActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        ImageView imgView = (ImageView) findViewById(R.id.imgView);

        Bitmap myBitmap = getBitmapFromURL("http://pu-twitter.netau.net/card1.png");
        imgView.setImageBitmap(myBitmap);
    }


    public static Bitmap getBitmapFromURL(String src) {
        Bitmap myBitmap = null;
            try {

                URL url = new URL(src);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setDoInput(true);
                connection.connect();

                //Decryption
                try {
                Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
                SecretKeySpec keySpec = new SecretKeySpec("01234567890abcde".getBytes(), "AES");
                IvParameterSpec ivSpec = new IvParameterSpec("fedcba9876543210".getBytes());
                cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);

                InputStream input = connection.getInputStream();
                CipherInputStream cis = new CipherInputStream(input, cipher);
                FileOutputStream fos  = new FileOutputStream(
                           new File(Environment.getExternalStorageDirectory(), "card2_decrypted.jpg"));
                byte[] b = new byte[8];
                int i;

                while ((i = cis.read(b)) != -1) {
                  fos.write(b, 0, i);
                }
                fos.flush(); fos.close();
                cis.close(); input.close();


                //myBitmap = BitmapFactory.decodeStream(input);

                }
                catch(Exception e){
                    e.fillInStackTrace();
                    Log.v("ERROR","Errorchence : "+e);
                }

                return myBitmap;


            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
}

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

Ответы [ 2 ]

1 голос
/ 03 августа 2011

ОК, вам не нужно сохранять изображения:

    public static Bitmap getBitmapFromURL(String src) {
        Bitmap myBitmap = null;
            try {

                URL url = new URL(src);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setDoInput(true);
                connection.connect();

                //Decryption
                try {
                Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
                SecretKeySpec keySpec = new SecretKeySpec("01234567890abcde".getBytes(), "AES");
                IvParameterSpec ivSpec = new IvParameterSpec("fedcba9876543210".getBytes());
                cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);

                InputStream input = connection.getInputStream();
                CipherInputStream cis = new CipherInputStream(input, cipher);


                myBitmap = BitmapFactory.decodeStream(cis);

                }
                catch(Exception e){
                    e.fillInStackTrace();
                    Log.v("ERROR","Errorchence : "+e);
                }

                return myBitmap;


            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
}
0 голосов
/ 03 августа 2011

Вам нужно использовать ImageView, чтобы показать изображение.во-вторых, viewview может принимать растровое изображение, ресурс или URI.но растровое изображение лучше, потому что использование URI и ресурса означает, что декодирование изображения до его размещения происходит в потоке пользовательского интерфейса, что не очень хорошая вещь для изображений.

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

myImageView.setImageBitmap(myImageBitmap);

, чтобы получить растровое изображение с SD-карты, вы можете использовать BitmapFactory.decodeFile ();функция например.Я обычно декодирую изображения в растровые изображения прямо из потока из Интернета, а затем сохраняю растровое изображение в виде файла на SD.я считаю, что это лучшее решение.

File f = new File(cacheDir, filename);
        OutputStream outStream = new FileOutputStream(f);
        Bitmap bmp;
        bmp = BitmapFactory.decodeStream(new FlushedInputStream(inputStream));
        bmp.compress(Bitmap.CompressFormat.PNG, 90, outStream);

, где я использую функцию сбрасываемого потока ввода из-за ошибки в соединении URL.см. эту ссылку

, поскольку для кеша вы определенно можете использовать SDCard.это намного лучше, чем использовать для этого память телефона (то есть каталог кеша на телефоне, который заполняет память телефона), вы можете просто очистить кэш sd, удалив все изображения в папке кеша onDestroy ().это просто.и если вам нравится кэш в памяти, то используйте карту hashMap, weakReference или softReference.Я предлагаю для более длительного хранения хэш-карту, но будьте осторожны с потреблением памяти.

для изображений «Ленивая загрузка» см. эту ссылку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...