繁体   English   中英

在onResume方法中启动AsyncTask是否会花费更多内存?

[英]Does starting an AsyncTask inside onResume method does cost more memory?

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

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

    }

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

您的新异步任务什么也不做。

AsyncTasks彼此之后执行。

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

AsyncTask只是用于管理后台任务和UI更新的线程的实现。 从文档开始, AsyncTask被设计为围绕android中的ThreadHandler的帮助器类。

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

因此,对于您的问题,每次调用new MyAsynctask().execute(); 新线程将启动。 如果没有完成,较老的也会运行。

要取消先前的任务,可以使用task的全局实例,并通过getStatus()检查状态是否为RUNNING。

 if(asyncTask!=null && asyncTask.getStatus()== AsyncTask.Status.RUNNING){
            asyncTask.cancel(true);
        }

在您的情况下,您可以在onResume()创建新任务,因此每次您的活动恢复时都会创建新线程,这不是刷新屏幕的内存有效解决方案。
有关取消任务的更多详细信息,请参阅取消任务cancel(boolean)部分

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

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

  1. 每次创建(重新) Activity
  2. 您从另一个Activity回来
  3. 您更改屏幕方向
  4. 您从另一个由Intent启动的Application回来
  5. 您关闭并重新打开您的App
  6. ...

您可能想要为AsyncTask保留一个类字段,并在onCreate()实例化它:

private MyAsyncTask asyncTask;

如果Activty未被销毁(点数:1、2(可能),4(可能),5(可能)),则可以轻松检查asyncTask状态并在需要时将其取消。

问题在于,如果重新创建了Activity ,则在启动新的AsyncTask可能仍在运行。 并且由于Activity实例是新实例,因此asyncTask引用也将指向新对象 :在这种情况下,您将在后台运行一个野蛮Thread

除非Android的操作系统杀死Activity的自有Thread (对此不确定)否则您可能仍然可以通过了解并确保 AsyncTask最多运行几秒钟而不执行任何阻塞的IO操作来逃脱AsyncTask 但这并不是真正的工程解决方案。


我想说, 最好的,更符合标准的解决方案是:通过在Activity保留对AsyncTask的引用,只需在onPause()方法中调用asyncTask.cancel() 而且,您可以确保在Activity暂停或销毁之前,将取消AsyncTask的线程。

您的代码将如下所示:

private MyAsyncTask asyncTask;

protected void onCreate() {
    this.asyncTask = new MyAsyncTask();
}

protected void onResume() {
    this.asyncTask.execute();
}

protected void onPause() {
    this.asyncTask.cancel();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM