将堆(frag case)增长到8.837MB,以获得6220816字节的分配错误

时间:2015-01-08 12:46:07

标签: android

我正在尝试使用15到20张图像在修复时间逐一显示在livewallpaper背景上,但我面临增长堆问题(将堆积(碎片情况)增加到8.987MB,用于6220816字节分配)我有搜索一切,但无法通过这个 任何帮助请求。

这是我的代码

公共类LiveWallpaperService扩展了WallpaperService {

private float x;
private int y;
private int angle;
private int speed;

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

@Override
public void onDestroy() {
    super.onDestroy();
}

@Override
public Engine onCreateEngine() {
    stopSelf();
    return new MyWallpaperEngine();
}

class MyWallpaperEngine extends Engine {

    private final Handler handle = new Handler();
    private final Runnable drawRunner = new Runnable() {

        @Override
        public void run() {
            draw();
        }
    };

    private Boolean visble = true;
    public Bitmap mBackgroundImage;
    public String name;
    int[] mImagesArray;
    private int mImagesArrayIndex = 0;

    MyWallpaperEngine() {

        mImagesArray = new int[] { R.drawable.love_1_mini,
                R.drawable.love_2_mini, R.drawable.love_3_mini,
                R.drawable.love_4_mini, R.drawable.love_5_mini,

                R.drawable.love_6_mini, R.drawable.love_7_mini,
                R.drawable.love_8_mini, R.drawable.love_9_mini,
                R.drawable.love_10_mini,

                R.drawable.love_11_mini, R.drawable.love_12_mini,
                R.drawable.love_13_mini, R.drawable.love_14_mini,
                R.drawable.love_15_mini, R.drawable.love_16_mini,
                R.drawable.love_17_mini, R.drawable.love_18_mini,
                R.drawable.love_19_mini, R.drawable.love_20_mini };

        if (mImagesArrayIndex == 0) {
            x = -330; // initialize x position
            y = 0; // initialize y position
        } else {
            x = -330; // initialize x position
            y = 0; // initialize y position
        }

    }

    @Override
    public Bundle onCommand(String action, int x, int y, int z,
            Bundle extras, boolean resultRequested) {
        return super.onCommand(action, x, y, z, extras, resultRequested);
    }

    @Override
    public void onCreate(SurfaceHolder surfaceHolder) {
        super.onCreate(surfaceHolder);
    }

    @Override
    public void onOffsetsChanged(float xOffset, float yOffset,
            float xOffsetStep, float yOffsetStep, int xPixelOffset,
            int yPixelOffset) {
        draw();
    }

    @Override
    public void onSurfaceCreated(SurfaceHolder holder) {
        super.onSurfaceCreated(holder);
        this.visble = false;

    }

    @Override
    public void onTouchEvent(MotionEvent event) {

    }

    @Override
    public void onVisibilityChanged(boolean visible) {
        this.visble = visible;
        if (visible) {
            handle.post(drawRunner);
        } else {
            handle.removeCallbacks(drawRunner);
        }

        super.onVisibilityChanged(visible);
    }

    private void incrementCounter() {
        mImagesArrayIndex++;
        if (mImagesArrayIndex >= mImagesArray.length) {
            mImagesArrayIndex = 0;

        }

    }

    @SuppressWarnings("deprecation")
    void draw() {

        int count = mImagesArray[mImagesArrayIndex];
        final SurfaceHolder holder = getSurfaceHolder();
        Canvas c = null;
        int scale = 2;
        Resources res = getResources();
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inPreferredConfig = Bitmap.Config.RGB_565;
        o2.inSampleSize = scale;
        o2.inPurgeable = true;
        o2.inInputShareable = true;
        Bitmap image = BitmapFactory.decodeResource(res, count, o2);

        Calendar mCalendar = Calendar.getInstance();
        int h = mCalendar.get(Calendar.HOUR);
        int m = mCalendar.get(Calendar.MINUTE);
        int s = mCalendar.get(Calendar.SECOND);

        if (s == 10) {
            mImagesArrayIndex = 0;
        }

        try {
            Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
            c = holder.lockCanvas();
            c.drawColor(Color.RED);

            if (c != null) {
                int a = 0;
                int counting = 0;
                if (counting == a) {
                    a++;
                    counting++;

                    c.drawBitmap(image, x, y, paint);

                    int widthhhh = c.getWidth();

                    x = (float) (x + 10.10);

                    if (x > widthhhh + 400) {

                        image.recycle();
                        image = null;
                        incrementCounter();

                    }

                }

                paint.setColor(Color.RED);

            }

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } finally {

            try {
                if (c != null) {
                    holder.unlockCanvasAndPost(c);
                }
                handle.removeCallbacks(drawRunner);
                if (visble) {
                    handle.postDelayed(drawRunner, 10);
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
        }
    }

}

}

2 个答案:

答案 0 :(得分:1)

  

Bitmap image = BitmapFactory.decodeResource(getResources(),mImagesArray [mImagesArrayIndex]);

完成后,请致电image.recycle()(请参阅javadoc)。

答案 1 :(得分:1)

在draw()方法中,您有以下代码:

    Bitmap image = BitmapFactory.decodeResource(getResources(),
            mImagesArray[mImagesArrayIndex]);
    int count = mImagesArray[mImagesArrayIndex];
    final SurfaceHolder holder = getSurfaceHolder();
    Canvas c = null;
    int scale = 4;
    Resources res = getResources();
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inPreferredConfig = Bitmap.Config.RGB_565;
    o2.inSampleSize = scale;
    o2.inPurgeable = true;
    o2.inInputShareable = true;
    image = BitmapFactory.decodeResource(res, count, o2);

注意第一行调用BitmapFactory.decodeResource()并将结果分配给变量image,然后,最后一行再次调用{{1并将结果赋给变量BitmapFactory.decodeResource()。你从未在第一个解码图像上调用image,因此这会给你一个内存泄漏。