Java 在onResume方法内启动异步任务是否需要更多内存?

Java 在onResume方法内启动异步任务是否需要更多内存?,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我使用AsyncTask从本地数据库(sqlite)更新列表,如下所示: @Override public void onResume() { super.onResume(); new MyAsynctask().execute(); } 我需要清楚地解释每次执行新的MyAsynctask时会发生什么,以及先前创建的MyAsynctask会发生什么,以及这种方式是否会占用更多内存?AsyncTask只是一个线程的实现,用于管理后台任务和UI更

我使用
AsyncTask
从本地数据库(sqlite)更新列表,如下所示:

 @Override
    public void onResume() {
        super.onResume();
       new MyAsynctask().execute();

    }

我需要清楚地解释每次执行新的MyAsynctask时会发生什么,以及先前创建的MyAsynctask会发生什么,以及这种方式是否会占用更多内存?

AsyncTask
只是一个线程的实现,用于管理后台任务和UI更新
AsyncTask
被设计成android中
Thread
Handler
的助手类

AsyncTask允许正确且轻松地使用UI线程。此类允许您在UI线程上执行后台操作和发布结果,而无需操作线程和/或处理程序。

因此,每次调用
newmyasynctask().execute()时,您都会遇到问题将启动一个新线程。如果没有完成,旧的也会运行。

要取消上一个任务,您可以使用任务的全局实例,并通过
getStatus()

在您的情况下,您在
onResume()
中创建新任务,因此每次活动恢复时都会创建新线程,这不是刷新屏幕的内存有效解决方案。

有关取消任务的更多详细信息,请阅读部分和。

如果您知道如何管理它,则它不是内存泄漏

您的
AsyncTask
将在
onResume()函数中执行,因此它将在以下情况下运行:

  • 每次(重新)创建
    活动时
  • 您从另一个
    活动回来
  • 你改变屏幕方向
  • 您从另一个由
    意图启动的
    应用程序返回
  • 您关闭并重新打开
    应用程序
  • 您可能希望为
    AsyncTask
    保留一个类字段,并在
    onCreate()
    中实例化它:

    如果
    activity
    未被销毁(第1点、第2点(可能)、第4点(可能)、第5点(可能)),您可以轻松检查
    asyncTask
    状态,并在需要时取消它

    问题在于,如果重新创建了
    活动
    ,则启动新任务时,旧的
    异步任务
    可能仍在运行。由于
    活动
    实例是新实例,因此
    异步任务
    引用也将指向一个新对象:在这种情况下,您将在后台运行一个savage
    线程

    除非
    Android
    的操作系统杀死了
    活动
    拥有的
    线程
    (对此不确定),否则您仍然可以知道并确保
    异步任务
    最多运行几秒钟,而不执行任何阻塞IO操作。但这并不是一个真正的工程解决方案


    我想说,最好且更符合标准的解决方案是:通过在
    活动中保持对
    AsyncTask
    的引用,只需在
    onPause()
    方法中调用
    AsyncTask.cancel()
    。您将确保在您的
    活动
    暂停或销毁之前,
    异步任务
    的线程将被取消

    然后,您的代码将如下所示:

    private MyAsyncTask asyncTask;
    
    protected void onCreate() {
        this.asyncTask = new MyAsyncTask();
    }
    
    protected void onResume() {
        this.asyncTask.execute();
    }
    
    protected void onPause() {
        this.asyncTask.cancel();
    }
    

    您的新异步任务不执行任何操作

    异步任务是一个接一个地执行的


    只有当旧异步任务结束时,新的异步任务才会开始运行。

    问题是:每次在活动中调用onResume时,都会创建并执行一个新的MyAsynctask。巨大的内存泄漏:o。你必须自己停止它,重新创建它!请给我停止MyAsynctask并重新创建的最佳实践it@ReneFerrari您如何判断这是一个(巨大的)内存泄漏?异步任务一结束,它就被清除了。我想他的意思是
    OutOfMemory
    ,而不是内存泄漏。内存泄漏对我来说是指您没有预料到的仍在运行并消耗内存的东西。本例中的问题是,如果多次调用onResume(),许多异步任务将并行运行。因此,内存消耗增加了很多,正如Enzokie所提到的,可能会导致OutOfMemory。ADM已经写了一个解释如何避免这种情况的答案:)不幸的是,如果重新创建
    活动
    ,那么
    异步任务
    实例也将重新创建。如果随后检查状态,则它将与新的
    asyncTask
    实例相关,而不是与旧实例(可能仍在运行)相关。我认为他最好在
    onPause()
    中手动停止
    任务。我只是暗示如何检查状态。这取决于活动生命周期的实现和参与。当异步任务死亡时,ayct任务在doInBackground()结束时结束,然后在onPostExecute()结束后结束。
    
    private MyAsyncTask asyncTask;
    
    private MyAsyncTask asyncTask;
    
    protected void onCreate() {
        this.asyncTask = new MyAsyncTask();
    }
    
    protected void onResume() {
        this.asyncTask.execute();
    }
    
    protected void onPause() {
        this.asyncTask.cancel();
    }