0

我不断交替出现 OOM 错误或 Canvas 尝试绘制回收的位图错误。我不确定哪种方法是最好的方法,希望能提供一些意见。我有一个主屏幕,上面有几张图像。如果我这样处理它,每当我加载回屏幕时都会收到 OOM 错误:

@Override
protected void onDestroy() {
    super.onDestroy();

    recycleHomescreenImages();
    unbindDrawables(findViewById(R.id.homescreen_root_view));
    System.gc();
}

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
    view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
        unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
    ((ViewGroup) view).removeAllViews();
    }
}

我的主屏幕上的图像似乎没有被正确回收。但是,如果我将 unbindDrawables(View view) 方法更改为如下所示,则会出现 Canvas 试图使用回收的位图错误。

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
    view.getBackground().setCallback(null);
    if (view.getBackground() instanceof BitmapDrawable)
        ((BitmapDrawable)view.getBackground()).getBitmap().recycle();
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
        unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
    ((ViewGroup) view).removeAllViews();
    }
}

感谢您的任何意见,如果您需要更多信息,请告诉我。

编辑:更令人困惑的是,在我第一次恢复活动后,我没有使用回收的位图获得 Canvas,但只有当我第二次恢复活动时。

4

0 回答 0