Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 垃圾收集器如何释放异步任务分配的内存_Android_Memory_Android Asynctask - Fatal编程技术网

Android 垃圾收集器如何释放异步任务分配的内存

Android 垃圾收集器如何释放异步任务分配的内存,android,memory,android-asynctask,Android,Memory,Android Asynctask,在MainActivity中,每x秒创建一个新的AsyncTask,并调用execute with new RTaskthis.executeparam;将数据异步发送到服务器。我认为经常创建新任务会导致内存泄漏。那么,当垃圾收集器释放内存时,如何将任务引用设置为null以允许收集它呢? 我试着用这个。对;在onPostExecute中,但我已经读到,由于Android框架的一个缺陷,onpost从未被调用。如有任何建议,将不胜感激 感谢事实上,异步任务回收不应该有任何问题,除非您从param持

在MainActivity中,每x秒创建一个新的AsyncTask,并调用execute with new RTaskthis.executeparam;将数据异步发送到服务器。我认为经常创建新任务会导致内存泄漏。那么,当垃圾收集器释放内存时,如何将任务引用设置为null以允许收集它呢? 我试着用这个。对;在onPostExecute中,但我已经读到,由于Android框架的一个缺陷,onpost从未被调用。如有任何建议,将不胜感激


感谢

事实上,异步任务回收不应该有任何问题,除非您从param持有对它的任何引用,或者在doInBackground中生成内存泄漏

因此,您可能会认为,如果要创建许多长时间运行的异步任务,那么会导致一些内存问题。事实上,至少在最新的安卓版本上不是这样。这项任务表明

它使用单例有界执行器:

private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;
private static final int KEEP_ALIVE = 1;

public static final Executor THREAD_POOL_EXECUTOR
    = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
            TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
这意味着executor不会在同一时间运行超过128个异步任务。据我所知,128个任务不是很大

它对执行器使用有界查询:

private static final BlockingQueue<Runnable> sPoolWorkQueue =
        new LinkedBlockingQueue<Runnable>(10);
因此,基于以上几点,同时创建和运行异步任务的数量是有限的,而且不会太大。所以,如果AsyncTask中的代码没有造成任何内存泄漏,那么根据我的理解,就没有问题了。同时,Android不会让你用异步任务发送垃圾邮件。如果您担心同时创建的线程太多,请签出以熟悉它管理内存的方式

特别是在您的情况下,我认为在出现类似请求的情况下,在前一个请求尚未完成的情况下执行另一个服务器请求不是一个好主意,而且也没有必要执行许多频繁的小请求-在这种情况下,您的应用程序会消耗太快的电池

关于取消通话,基于:

取消任务

可以通过调用cancelboolean随时取消任务。 调用此方法将导致取消对的后续调用 返回true。调用此方法后,改为onCancelledObject 将在之后调用onPostExecuteObject的 doInBackgroundObject[]返回。确保任务已取消 您应该尽可能快地检查 如果可能,从doInBackgroundObject[]定期取消 例如,在循环内部


所以,我不确定你的意思是我试着用这个;在onPostExecute中,如果从onPostExecute调用,则取消与此无关。它可以从AsyncTask或doInBackground调用,如果在AsyncTask中有一个循环,则最好调用它,以便在调用cancel后停止其执行。

实际上,AsyncTask循环不应该有任何问题,除非您从param中保留对它的任何引用或在doInBackground中生成内存泄漏

因此,您可能会认为,如果要创建许多长时间运行的异步任务,那么会导致一些内存问题。事实上,至少在最新的安卓版本上不是这样。这项任务表明

它使用单例有界执行器:

private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;
private static final int KEEP_ALIVE = 1;

public static final Executor THREAD_POOL_EXECUTOR
    = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
            TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
这意味着executor不会在同一时间运行超过128个异步任务。据我所知,128个任务不是很大

它对执行器使用有界查询:

private static final BlockingQueue<Runnable> sPoolWorkQueue =
        new LinkedBlockingQueue<Runnable>(10);
因此,基于以上几点,同时创建和运行异步任务的数量是有限的,而且不会太大。所以,如果AsyncTask中的代码没有造成任何内存泄漏,那么根据我的理解,就没有问题了。同时,Android不会让你用异步任务发送垃圾邮件。如果您担心同时创建的线程太多,请签出以熟悉它管理内存的方式

特别是在您的情况下,我认为在出现类似请求的情况下,在前一个请求尚未完成的情况下执行另一个服务器请求不是一个好主意,而且也没有必要执行许多频繁的小请求-在这种情况下,您的应用程序会消耗太快的电池

关于取消通话,基于:

取消任务

可以通过调用cancelboolean随时取消任务。 调用此方法将导致取消对的后续调用 返回true。调用此方法后,改为onCancelledObject 将在之后调用onPostExecuteObject的 doInBackgroundObject[]返回。确保任务已取消 您应该尽可能快地检查 如果可能,从doInBackgroundObject[]定期取消 例如,在循环内部

所以,我不确定你的意思是我试着用这个;在onPostExecute中,如果从onPostExecute调用,则取消与此无关。它可以从AsyncTask或doInBackground调用,如果您在AsyncTask中有一个循环,则最好调用它,以便在调用cancel后停止其执行

如何收集垃圾 r释放异步任务分配内存

就像它为任何其他类释放内存一样。异步任务没有什么特别之处。一旦任务完成,只要没有其他类引用它,它就会被垃圾收集。将任务引用设置为null将有所帮助

垃圾收集器如何释放异步任务分配的内存


就像它为任何其他类释放内存一样。异步任务没有什么特别之处。一旦任务完成,只要没有其他类引用它,它就会被垃圾收集。将任务引用设置为null会有所帮助。

您确定从不调用onPostExecute吗?我似乎经常使用它,并且对它并不失望。。但是是的,回到主要关注区域GC,尝试将其设置为null并手动删除对该变量的所有引用,尝试隔离它。。是的,这个应该是ok@stack_ved谢谢你的回答,我感到松了一口气,所以当我实例化一个新任务时,完成任务的前一个任务将自动从GC收集,因为他的引用将设置为null?你确定永远不会调用onPostExecute吗,我似乎经常使用它,并没有对它感到失望。。但是是的,回到主要关注区域GC,尝试将其设置为null并手动删除对该变量的所有引用,尝试隔离它。。是的,这个应该是ok@stack_ved谢谢你的回答,我感觉很轻松,所以当我实例化一个新任务时,完成任务的前一个将自动从GC中收集,因为他的引用将设置为null?如果我将MainActivity传递给AsyncTask构造函数以更改activity全局变量值,则会出现问题?如果您将AsyncTask无限期运行,然后我会怀疑里面有问题。不过,如果您只是执行网络请求,那么在超时/响应之后,它将完成,并且AsyncTask将结束=>无泄漏。谢谢!你的答案很有用!如果我将MainActivity传递给AsyncTask构造函数以更改activity全局变量值,则会出现问题?如果您让AsyncTask无限期运行,那么我会怀疑其中存在问题。不过,如果您只是执行网络请求,那么在超时/响应之后,它将完成,并且AsyncTask将结束=>无泄漏。谢谢!你的答案很有用!