Canvas: 尝试绘制太大的位图(151099200字节)

3

我有一个Android应用程序,正在尝试绘制太大的内容而崩溃。我查看了在stackoverflow上发布的类似问题的答案,但是没有一个解决方案适用于我。所有图像都在各自的文件夹中(请参见附加的图像)。因此,我现在对导致崩溃的原因感到困惑。enter image description here

    2019-11-27 11:22:49.608 10506-10506/com.example.android.tourguide E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.android.tourguide, PID: 10506
    java.lang.RuntimeException: Canvas: trying to draw too large(151099200bytes) bitmap.
        at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260)
        at android.graphics.Canvas.drawBitmap(Canvas.java:1415)
        at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:545)
        at android.widget.ImageView.onDraw(ImageView.java:1286)
        at android.view.View.draw(View.java:17071)
        at android.view.View.updateDisplayListIfDirty(View.java:16053)
        at android.view.View.draw(View.java:16837)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
        at android.view.View.updateDisplayListIfDirty(View.java:16048)
        at android.view.View.draw(View.java:16837)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
        at android.widget.ListView.drawChild(ListView.java:3506)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
        at android.widget.AbsListView.dispatchDraw(AbsListView.java:2635)
        at android.widget.ListView.dispatchDraw(ListView.java:3501)
        at android.view.View.draw(View.java:17074)
        at android.widget.AbsListView.draw(AbsListView.java:4298)
        at android.view.View.updateDisplayListIfDirty(View.java:16053)
        at android.view.View.draw(View.java:16837)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
        at android.view.View.draw(View.java:17074)
        at androidx.viewpager.widget.ViewPager.draw(ViewPager.java:2426)
        at android.view.View.updateDisplayListIfDirty(View.java:16053)
        at android.view.View.draw(View.java:16837)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
        at android.view.View.updateDisplayListIfDirty(View.java:16048)
        at android.view.View.draw(View.java:16837)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
        at android.view.View.updateDisplayListIfDirty(View.java:16048)
        at android.view.View.draw(View.java:16837)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
        at android.view.View.updateDisplayListIfDirty(View.java:16048)
        at android.view.View.draw(View.java:16837)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
        at android.view.View.updateDisplayListIfDirty(View.java:16048)
        at android.view.View.draw(View.java:16837)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
        at android.view.View.updateDisplayListIfDirty(View.java:16048)
        at android.view.View.draw(View.java:16837)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
        at android.view.View.draw(View.java:17074)
        at com.android.internal.policy.DecorView.draw(DecorView.java:751)
        at android.view.View.updateDisplayListIfDirty(View.java:16053)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:656)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:662)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:770)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2796)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2604)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2211)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
        at android.view.Choreographer.doCallbacks(Choreographer.java:683)
        at android.view.Choreographer.doFrame(Choreographer.java:619)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
        at android.os.Handler.handleCallback(Handler.java:751)
2019-11-27 11:22:49.608 10506-10506/com.example.android.tourguide E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

我在这里使用了ListView:

    public class AttractionsAdapter  extends ArrayAdapter<Attractions> {

    public AttractionsAdapter(Context context, ArrayList<Attractions> attractions) {
        super(context, 0, attractions);
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Check if an existing view is being reused, otherwise inflate the view
        View listView = convertView;
        if (listView == null) {
            listView = LayoutInflater.from(getContext()).inflate(
                    R.layout.list_item_layout, parent, false);
        }
    Attractions currentAttraction = getItem(position);

    TextView attractionTextView = listView.findViewById(R.id.attraction_name_view);

        attractionTextView.setText(currentAttraction.getName());


    // Find the ImageView in the list_item.xml layout with the ID image.
    ImageView imageView = (listView.findViewById(R.id.image));

        if (currentAttraction.hasImage()) {

        imageView.setImageResource(currentAttraction.getImageId());
        imageView.setVisibility(View.VISIBLE);
    } else {

        imageView.setVisibility(View.GONE);
    }

        return listView;
}

}

以及我的碎片:

public class ClubsFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstances) {
        View rootView = inflater.inflate(R.layout.attraction_layout, container, false);

        ArrayList<Attractions> attractions = new ArrayList<>();
        attractions.add(new Attractions(R.string.club_one, R.drawable.shakers));
        attractions.add(new Attractions(R.string.club_two,R.drawable.jojo));
        attractions.add(new Attractions(R.string.club_three, R.drawable.maia));
        attractions.add(new Attractions(R.string.club_four, R.drawable.great));


        AttractionsAdapter adapter = new AttractionsAdapter(getActivity(), attractions);

        ListView listView = rootView.findViewById(R.id.list);

        listView.setAdapter(adapter);
        return rootView;
    }

}

我的布局:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ImageView
    android:id="@+id/image"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<RelativeLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@id/image"
    android:orientation="vertical"
    android:paddingLeft="16dp">

    <TextView
        android:id="@+id/attraction_name_view"
        android:layout_width="match_parent"
        android:layout_height="44dp"
        android:layout_weight="1"
        android:gravity="top"
        android:textAppearance="?android:textAppearanceMedium"
        android:textColor="@android:color/white"
        tools:text="one" />

    <ImageView
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="16dp" />
</RelativeLayout>


1
请考虑使用实际的代码片段而不是您IDE的截图。 - Giorgos Neokleous
1
请勿将代码作为截图分享,因为它无法被搜索。请发布代码和堆栈跟踪信息。 - patrick.elmquist
显示异常堆栈跟踪。 - Vladyslav Matviienko
你的一些ListView绘制存在问题。请展示使用ListView的代码以及该ListView项的布局。 - Vladyslav Matviienko
它在压缩状态下为4.4mb,但在内存中可能会更大。 - Bracadabra
显示剩余6条评论
1个回答

1

我通过移除所有超过2mb的图片来解决了这个问题。现在应用程序不再崩溃。 感谢@Bracadabra 和@Vladyslav的评论。他们帮助我找出了问题所在并进行了修复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接