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

时间:2018-01-10 07:56:10

标签: java android multithreading android-asynctask

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

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

    }

我需要清楚地解释每次新MyAsynctask执行时会发生什么,以及之前创建的前一个MyAsynctask发生了什么,以及这种方式会花费更多内存?

3 个答案:

答案 0 :(得分:1)

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

AsyncTasks相继执行。

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

答案 1 :(得分:0)

AsyncTask只是管理后台任务和UI更新的线程实现。 AsyncTask被设计为android中的ThreadHandler附近的助手类。文档。

  

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

因此,每次致电new MyAsynctask().execute();时,您的问题都将开始。如果没有完成,旧的也会运行。

要取消上一个任务,您可以使用全局任务实例,并通过getStatus()检查状态是否正在运行

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

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

答案 2 :(得分:0)

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

您的AsyncTask将在onResume()函数内执行,因此它会在以下时间运行:

  1. 每次Activity被重新创建
  2. 你从另一个Activity
  3. 回来
  4. 您更改了屏幕方向
  5. 您是从Application
  6. 开始的另一个Intent回来的
  7. 您关闭并重新打开App
  8. ...
  9. 您可能希望为AsyncTask保留一个类字段,并在onCreate()中对其进行实例化:

    private MyAsyncTask asyncTask;
    

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

    问题是,如果重新创建AsyncTask,则在您开始新的Activity时,旧Activity可能仍在运行。由于asyncTask实例是新的,Thread引用也会指向一个新的对象:在这种情况下,您将有一个野蛮的Android在运行背景。

    除非Activity的操作系统杀死了Thread拥有的AsyncTask (不确定),否则您仍可能获得通过了解并确保您的AsyncTask最多运行几秒钟,而不执行任何阻止IO操作。但这并不是一个真正的工程解决方案。

    我要说的是,最佳且更符合标准的解决方案是:通过保留ActivityasyncTask.cancel()的引用,只需调用{{ 1}}在您的onPause()方法中。并且您确定在AsyncTask被暂停或销毁之前,Activity的帖子将被取消。

    您的代码将如下所示:

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