我的应用程序中有一个功能,可将存储在应用程序内存中的离线图片添加到列表视图中。 如您所见,代码非常简单:
if(FirstTag != null) {
if (FirstTag.equals("care"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.care));
else if (FirstTag.equals("holidays"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.holidays));
else if (FirstTag.equals("Thing Different"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.thinkdifferent2));
else if (FirstTag.equals("Fun Activities"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.fun));
else if (FirstTag.equals("מערך חברות")) }
它只是检查json对象中的一个值,并通过该值在列表视图中放置图片,当然有20个值而不是5个,但是我不认为我应该包含所有值... 所有图片都被压缩,当我不加载很多图片时,应用程序不会崩溃。 但是,当我尝试使用列表视图中每个项目的图片启动应用程序时,一切似乎都正常运行,然后当您向下滚动应用程序滞后并在一秒钟后崩溃并出现以下错误:
9-30 18:35:18.299 7859-7859 / com.example.negev.peulibraryv201 E / AndroidRuntime:FATAL EXCEPTION:main 流程:com.example.negev.peulibraryv201,PID:7859 java.lang.OutOfMemoryError:无法分配带有16777216可用字节和261MB的681099532字节分配,直到OOM 在dalvik.system.VMRuntime.newNonMovableArray(本机方法) 在android.graphics.BitmapFactory.nativeDecodeAsset(本地方法) 在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:700) 在android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:535) 在android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1179) 在android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:770) 在android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:621) 在android.content.res.Resources.getDrawable(Resources.java:1640) 在android.content.res.Resources.getDrawable(Resources.java:1611) 在com.example.negev.peulibraryv201.GamesLibraryAdapter.getView(GamesLibraryAdapter.java:70) 在android.widget.AbsListView.obtainView(AbsListView.java:3238) 在android.widget.ListView.makeAndAddView(ListView.java:2147) 在android.widget.ListView.fillDown(ListView.java:767) 在android.widget.ListView.fillGap(ListView.java:731) 在android.widget.AbsListView.trackMotionScroll(AbsListView.java:8292) 在android.widget.ListView.trackMotionScroll(ListView.java:2065) 在android.widget.AbsListView $ FlingRunnable.run(AbsListView.java:7719) 在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:927) 在android.view.Choreographer.doCallbacks(Choreographer.java:702) 在android.view.Choreographer.doFrame(Choreographer.java:635) 在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:913) 在android.os.Handler.handleCallback(Handler.java:751) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:154) 在android.app.ActivityThread.main(ActivityThread.java:6682) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1520) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
我已经将这些行添加到清单中了
android:hardwareAccelerated="false"
android:largeHeap="true"
它没有用,您认为我能做到吗? 谢谢!
答案 0 :(得分:0)
您应该做的是在屏幕上可见的同时动态加载数据。 由于这是一项艰苦的工作,因此Google已经为您做到了。 您需要在列表视图中使用ArrayAdapter,并在需要时让Andriod要求您提供更多数据。 它的代码太多,无法详细说明,但请看this Goolge I/O video。 网络上有许多教程,详细介绍了如何执行此操作。 看看here。