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()
中,它在地图视图上显示覆盖

现在,这种设计的问题是:

  • 首先是大约100个覆盖(
    ItemizedOverlays
    )在处理数据期间分配一些内存。下一步,使用覆盖也必须加载贴图块,在内存中运行
    Grow Heap(frag case)
    的问题,因为它必须加载位图(尽管我使用
    AsyncTask
    在并行执行器中加载和显示)
  • 平移和缩放将花费很长时间,因为有重叠显示,同时必须加载地图分幅。有时会弹出
    ANR
    对话框
  • 现在,我的套接字连接大部分时间(比如30分钟)都必须打开,因为我不确定何时接收到新数据,这意味着
    AsyncTask
    必须在后台运行大部分时间
  • 现在,我的计划是将这个AsyncTask类移动到IntentService类,在这个类中,套接字连接大部分时间都可以打开,但是如何使它与
    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有很好的描述: