反复滚动后的Android定制的ListView崩溃

问题描述 投票:0回答:3

我做了一个列表视图中使用自定义布局,但我每次滚动快,在logcat中出现以下错误应用程序崩溃的时间。

我还没有真正尝试过任何东西,因为我还不太熟悉的Android。我曾尝试到android:hardwareAccelerated="false",但仍然没有加入android:largeHeap="true"AndroidManifest.xml

public View getView(int position, View convertView, ViewGroup parent) {

            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.list_view_switch_account,null);
            TextView first = (TextView)convertView.findViewById(R.id.full_name);
            ImageView img = (ImageView)convertView.findViewById(R.id.profile_picture);

            Account account = accountList.get(position);
            first.setText(account.getName());
            byte[] imgs = account.getImage();
            Bitmap bitmap = BitmapFactory.decodeByteArray(imgs,0,imgs.length);
            img.setImageBitmap(bitmap);
//            status.setText(account.getStatus());

        return convertView;
    }
}

java.lang.OutOfMemoryError: Failed to allocate a 3481968 byte allocation with 1143504 free bytes and 1116KB until OOM
        at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
        at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
        at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:622)
        at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:645)
        at com.example.mgimoro.dietgo.AccountAdapter.getView(AccountAdapter.java:51)
        at android.widget.AbsListView.obtainView(AbsListView.java:2497)
        at android.widget.ListView.makeAndAddView(ListView.java:1930)
        at android.widget.ListView.fillDown(ListView.java:722)
        at android.widget.ListView.fillGap(ListView.java:686)
        at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5792)
        at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3705)
        at android.widget.AbsListView.onTouchMove(AbsListView.java:4221)
        at android.widget.AbsListView.onTouchEvent(AbsListView.java:3991)
        at android.view.View.dispatchTouchEvent(View.java:9480)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2662)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2304)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2668)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2318)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2668)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2318)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2668)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2318)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2668)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2318)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2668)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2318)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2668)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2318)
android android-bitmap
3个回答
1
投票

OutOfMemoryError异常的是Android,而发生特别是与位图处理的最常见的问题。此错误是由当物体不能分配由于缺乏存储空间,并且还,垃圾回收器不能释放一些空间,Java虚拟机(JVM)抛出。

正如阿列克谢提到的,你可以在你的清单文件中的android添加下面的实体:硬件加速=“假”,那么Android:largeHeap =“true”,可以将一些环境的工作。

<application
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">

如果您正从模拟器请VM堆这个错误

enter image description here


1
投票

你试图解码一个ListView里面一个大的位图。尝试DownSample位图或更好,但使用Glide或毕加索这样做对你。

更新:你还在使用它现在被替换ListView RecyclerViewRecyclerView是一个更好的工具来显示项目的列表。 如果你决定坚持ListView应实现ViewHolder模式,以尽量减少从而提高代码的性能视图通货膨胀。


0
投票

我会建议你改用RecyclerViewListView。因为它比ListView更先进。

下面是官方链接:https://developer.android.com/guide/topics/ui/layout/recyclerview

也可以尝试使用分页概念在你的RecyclerView。在数据的简单的话第一负载部分,即1-10项然后通过列表11-20项时用户滚动加载下一个数据即。这样的过程会增加你的加载时间,并降低内存负载。

© www.soinside.com 2019 - 2024. All rights reserved.