无法通过加载jpg文件分配内存-Android studio Erro

时间:2018-09-30 15:44:52

标签: java android android-studio

我的应用程序中有一个功能,可将存储在应用程序内存中的离线图片添加到列表视图中。 如您所见,代码非常简单:

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"

它没有用,您认为我能做到吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

您应该做的是在屏幕上可见的同时动态加载数据。 由于这是一项艰苦的工作,因此Google已经为您做到了。 您需要在列表视图中使用ArrayAdapter,并在需要时让Andriod要求您提供更多数据。 它的代码太多,无法详细说明,但请看this Goolge I/O video。 网络上有许多教程,详细介绍了如何执行此操作。 看看here