android mapview应用程序遇到内存问题(增长堆):帮助选择design AsyncTask或IntentService或Service?
我有一个地图视图,它需要显示大量来自网络的覆盖。现在,我当前的设计使用的是android mapview应用程序遇到内存问题(增长堆):帮助选择design AsyncTask或IntentService或Service?,android,android-asynctask,osmdroid,android-memory,android-intentservice,Android,Android Asynctask,Osmdroid,Android Memory,Android Intentservice,我有一个地图视图,它需要显示大量来自网络的覆盖。现在,我当前的设计使用的是AsyncTask,其中套接字连接在doInBackground()中打开,在publishProgress()中,它在地图视图上显示覆盖 现在,这种设计的问题是: 首先是大约100个覆盖(ItemizedOverlays)在处理数据期间分配一些内存。下一步,使用覆盖也必须加载贴图块,在内存中运行Grow Heap(frag case)的问题,因为它必须加载位图(尽管我使用AsyncTask在并行执行器中加载和显示) 平移
AsyncTask
,其中套接字连接在doInBackground()
中打开,在publishProgress()
中,它在地图视图上显示覆盖
现在,这种设计的问题是:
ItemizedOverlays
)在处理数据期间分配一些内存。下一步,使用覆盖也必须加载贴图块,在内存中运行Grow Heap(frag case)
的问题,因为它必须加载位图(尽管我使用AsyncTask
在并行执行器中加载和显示)ANR
对话框AsyncTask
必须在后台运行大部分时间FragmentActivity
通信呢?在开始之前,从我正在使用的AsyncTask
类转到IntentService
或Service
有意义吗
注意:我想转到IntentService
或服务的唯一原因是我遇到了内存问题,其中大多数是通过将内存分配给位图(maptiles)实现的。我也尝试过清理maptile缓存,但运气不太好。我尝试在一个计时器线程中调用System.gc()
,在某种程度上它似乎可以工作,但长期以来不确定它将如何执行
编辑:
底线是,GC
导致我的应用程序速度减慢。另外,请查看此链接,了解我是如何实际加载maptiles的:
作为一个提示,当没有覆盖层时,maptiles加载非常快速和良好。只有当数据通过网络接收并试图覆盖时,GC
才会多次触发。根据评论,GC听起来像是导致应用程序速度减慢。与其回收你的位图,不如你。这里列出了不同的问题,事实上这些问题是完全不同的
- 地图分幅导致osmdroid内存消耗的问题
- 关于如何以类似于推送模式的方式接收网络数据的问题
- 处理大量覆盖的问题=>多少?(100?)哪一种?我甚至不清楚这是否真的是你的问题李>
在我看来,这个问题应该被删除,取而代之的是一些具体的问题,这些问题应该得到恰当的表述 如果内存不足,请尝试按位图回收位图。回收()。并在清单中的应用程序标记中使用android:largeHeap=“true”。检查此项并让我知道。我已经在使用android:largeHeap=“true”
,bitmap.recycle()已尝试过,但在我的情况下无法使用,因为它是一个立即创建并返回的可绘制对象。(不在我的控制之下,因为API会处理此问题)您是否正在退出内存异常?还没有,但是GC_FOR_ALLOC在大多数情况下都会触发。如果您没有退出内存异常,那么您怎么能说您的内存正在耗尽?如果在触发GC_FOR_ALLOC之后没有得到outofmemory异常,这意味着堆栈中有一些空间可供使用。如果堆栈中没有所需的内存,那么只有您的内存不足。亲爱的Mker,我在前面多次明确地发布了非常类似的问题,将您所说的三件事分开。但没有富有成效的答案,所以我想为什么不加入俱乐部,因为所有这些都是相互关联的。所以,请不要介意我提出这些问题的方式。如果它冒犯了我,那么我将表示我的遗憾。澄清你的一些疑问:1.覆盖大部分是90%ItemizedOverlay
和10%Polygon
。2.请看我的另一段代码:3.我在这个问题中提到的网络部分,哪一个是有意义的AsyncTask
或Service
?让我们尝试以正确的顺序解决问题。首先,你需要一个好的基础:一张没有问题的地图(在处理大量重叠之前,并尝试实现高级网络)=>所以我会给这篇文章一个答案(主要是问题):亲爱的先生,请看一下这个链接:你能告诉我一个使用inBitmap
的例子吗?我在public Drawable getDrawable(final InputStream aFileInputStream)
中使用的方法是inBitmap
,MapTileProvider.MapTileProvider(22034):在15814毫秒内完成重缩放
这样可以吗?顺便说一句,缩放范围是从16到17。为什么每次重新缩放缓存都会被触发?有什么解决办法吗?你能帮我使用inBitmap吗?感觉它可能会起作用。重新缩放不应该花那么长时间,但这可能是因为您在虚拟机上施加的内存压力。Android对如何使用inBitmap有很好的描述: