Android 应用程序被杀死,但未调用OnTimmery
我的应用程序会被OOM杀死,但不会调用非即时方法 我使用Fresco进行图像缓存,因为我在4.4设备上有很多图像,我的应用程序被OOM杀死。我试图从显示图像的活动和我试图清除缓存以避免OOM的应用程序类中重写类似于ontrimmory()的方法,但我的应用程序仍然崩溃。 之后,我尝试在这个方法中设置日志,我注意到,即使我的应用程序崩溃,也不会调用这个方法 没有太多代码可显示:Android 应用程序被杀死,但未调用OnTimmery,android,out-of-memory,fresco,Android,Out Of Memory,Fresco,我的应用程序会被OOM杀死,但不会调用非即时方法 我使用Fresco进行图像缓存,因为我在4.4设备上有很多图像,我的应用程序被OOM杀死。我试图从显示图像的活动和我试图清除缓存以避免OOM的应用程序类中重写类似于ontrimmory()的方法,但我的应用程序仍然崩溃。 之后,我尝试在这个方法中设置日志,我注意到,即使我的应用程序崩溃,也不会调用这个方法 没有太多代码可显示: override fun onTrimMemory(level: Int) { Timber.d("Galler
override fun onTrimMemory(level: Int) {
Timber.d("GalleryActivity onTrimMemory %s", level)
if (level == ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW) {
Fresco.getImagePipeline().clearCaches()
}
}
我做错了什么,还是我的理解不对?当应用程序占用太多内存时,不应该调用这些方法吗
有没有办法解决这个问题?谢谢
更新,这是日志的外观:
位于android.graphics.Bitmap.createBitmap(Bitmap.java:913)
在android.graphics.drawable.VectorDrawable$VectorDrawableState.CreateCacheDBITMAPIFneed(VectorDrawable.java:834)
位于android.graphics.drawable.VectorDrawable.draw(VectorDrawable.java:318)
位于android.graphics.drawable.LayerDrawable.draw(LayerDrawable.java:916)
位于com.facebook.drawee.drawable.ForwardingDrawable.draw(ForwardingDrawable.java:185)
在com.facebook.drawee.drawable.ScaleTypeDrawable.draw上(ScaleTypeDrawable.java:123)
位于com.facebook.drawee.drawable.FadeDrawable.drawablewithalpha(FadeDrawable.java:302)
位于com.facebook.drawee.drawable.FadeDrawable.draw(FadeDrawable.java:289)
位于com.facebook.drawee.drawable.ForwardingDrawable.draw(ForwardingDrawable.java:185)
在com.facebook.drawee.generic.RootDrawable.draw(RootDrawable.java:81)我建议为这些目的在应用程序中添加单独的服务,并尝试使用
另一方面,奇怪的是,使用湿壁画会导致崩溃。作为一种解决方案,如果不违反您的要求,可以在具有上述API级别的设备上使用。您能给我一些关于如何使用RejectFromMemoryCache的提示吗?假设我在recyclerView/viewpager中显示图像,该如何使用此方法?对于所有加载的图像,还是仅针对屏幕外的图像?ThxI将对所有加载的图像使用它。我使用与Glide相同的功能
skipMemoryCache
。启用后,recyclerview将仅显示当前可见视图的图像缩略图。先前显示的图片将被清除,并从磁盘缓存中再次加载。不客气。请确保您没有试图分配巨大的位图。您应该调查是否只有一个原因总是导致OOM。你有日志吗?这不是你的问题,但我注意到在你的代码中你调用了cleanCaches()
。它不仅清理内存缓存和磁盘缓存,这在低RAM的情况下是没有意义的。相反,我建议您实现MemoryTrimmablerRegistry。请参阅Fresco上的“使用MemoryTrimmablerRegistry”将注册所有内存可修剪部分,如缓存和池,您的工作将是告诉MemoryTrimmablerRegistry调用。当设备内存不足时,修剪所有已注册的修剪。@defflt我添加了崩溃log@defhlt我试过你最后的建议,但没有任何改进,仍然崩溃