我使用自定义布局制作了一个列表视图,但是每次我快速滚动时,应用都会崩溃,并在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)
答案 0 :(得分:1)
OutOfMemoryError是android中最常见的问题,尤其是在处理位图时。当由于内存不足而无法分配对象时,Java虚拟机(JVM)会引发此错误,并且垃圾回收器无法释放一些空间。
如Aleksey所述,您可以在清单文件android:hardwareAccelerated =“ false”和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堆
答案 1 :(得分:1)
您正在尝试解码ListView中的大位图。尝试DownSample或更好地使用Glide或Picasso为您完成位图。
更新:您仍在使用ListView
,现在已被RecyclerView
取代。 RecyclerView
是显示项目列表的更好工具。
如果您决定坚持使用ListView
,则应实施ViewHolder
模式以最大程度地减少视图膨胀,从而提高代码的性能。
答案 2 :(得分:0)
我建议您使用RecyclerView
而不是ListView
。因为它比ListView
更先进。
这是官方链接: https://developer.android.com/guide/topics/ui/layout/recyclerview
还尝试在您的RecyclerView
中使用分页概念。简而言之,当用户滚动浏览列表时,首先加载数据的一部分,即1-10个项目,然后加载下一个数据,即11-20个项目。这样的过程会增加您的加载时间,并会减少内存负载。