Android SurfaceView BitmapFactory из-за нехватки памяти - PullRequest
0 голосов
/ 27 февраля 2012

Я столкнулся с очень интересной ситуацией. У меня есть доступ к двум устройствам, и одно из них является одним из самых высококлассных андроидов (Galaxy Note), а другое - приличным HTC Inspire. Теперь, благодаря разнице в этих двух устройствах, я смог заметить, что Galaxy Note прекрасно загружает мое приложение, но Inspire возвращает исключение из памяти. А трассировка стека говорит о том, что это битмапы в моем коде. У меня есть 5 растровых изображений с очень высоким разрешением (например, 1280 x 800). И я инициализирую каждый из них в конструкторе SurfaceView. Я знаю, что это глупая идея, но моя записка способна справиться с нагрузкой. Однако более хрупкие устройства не могут обрабатывать все эти растровые данные. Как мне решить мою проблему? Я могу снизить разрешение, но это последнее средство. Вот код, похожий на мой:

static public class GraphicsView extends SurfaceView implements Runnable {

    Thread t;
    SurfaceHolder holder;
    boolean sentinel = false;
    Bitmap b1, b2, b3, b4, b5;

    public GraphicsView(Context context) {
        super(context);
        holder = getHolder();
        b1 = BitmapFactory.decodeResource(getResources(), R.drawable.i);
        b2 = BitmapFactory.decodeResource(getResources(), R.drawable.like);
        b3 = BitmapFactory.decodeResource(getResources(), R.drawable.csharp);
        b4 = BitmapFactory.decodeResource(getResources(), R.drawable.python_and);
        b5 = BitmapFactory.decodeResource(getResources(), R.drawable.java);
        /**
        *
        * This is where the exceptions come!
        *
        **/
    }       

    public void run() {
        while (sentinel) {
            if(!holder.getSurface().isValid()) {
                continue;
            }
            try {
                Canvas canvas = holder.lockCanvas();
                //Drawing commands go here...ommited. These commands may use any of the 5 bitmaps                   
                holder.unlockCanvasAndPost(canvas);
            }catch(Exception e) {
                //Excpetion handling...its not getting here anyways
            }
        }
    }
    //More code below...Ommited...
} 

1 Ответ

1 голос
/ 20 апреля 2012

Моим решением было Bitmap.createScaledBitmap (b1, ширина, высота, true);

...