AsyncTask用于更长的进程

时间:2013-04-09 13:23:40

标签: android android-asynctask

我知道 AsyncTask 不适合长时间处理。他们的主要目标是从 UI线程中减轻负担,并在后台中执行操作。稍后完成更新相应的 UI线程

我知道内存泄漏,即在 doInBackground 完成后需要更新UI时,活动可能会被破坏。

我的问题是,我可以像简单的线程一样使用 AsyncTask 吗?

如果活动或应用程序死亡, AsyncTask 会发生什么?启动它?

质量要求

我不需要更新任何UI。

我不希望我的任务与Activity(启动它)相关联。

5 个答案:

答案 0 :(得分:4)

第一个问题:

是的,你可以。完全取决于你的逻辑。

第二个问题:

虽然应用程序被用户或系统杀死,但线程将在后台。

要解决第二种情况,请使用以下技术

请确保在申请或活动结束前完成AsyncTask

<强> AsyncTask yourAsyncTask

    @Override
    public void onDestroy(){
        //you may call the cancel() method but if it is not handled in doInBackground() method
        if(yourAsyncTask!=null)
        if (yourAsyncTask != null && yourAsyncTask.getStatus() != AsyncTask.Status.FINISHED)
            yourAsyncTask.cancel(true);
        super.onDestroy();
    }

答案 1 :(得分:2)

如果您只需要'doInBackground',只需使用普通线程。

new Thread("threadName", new Runnable(){ @Override run(){ } }).start();

使用AsyncTask的全部原因是具有preExecute和postExecute的功能,因此您不需要使用处理程序。

答案 2 :(得分:1)

即使应用程序被终止或崩溃,它仍会在后台启动。

答案 3 :(得分:1)

首先,一般性说明,如Android Docs所述:

AsyncTasks should ideally be used for short operations (a few seconds at the most). If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent pacakge such as Executor, ThreadPoolExecutor and FutureTask.

回答你的问题:

  1. 是 - 您可以使用Async任务,就像它只是一个后台线程一样 - Async任务只是ThreadHandler的包装,它允许线程与UI线程无缝通信。 警告!如果您计划更新UI线程,或以其他方式引用引用UI线程的回调中的活动或片段(即onProgressUpdated和/或onPostExecute),您应该明确检查该活动或片段仍处于可以引用和使用的状态。例如 - 从片段启动AsyncTask时,这是正确和错误的方法:
  2. 使用参考活动创建您的任务,以便您可以在完成后执行某些操作:

    private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
        Fragment mFragment;
    
        public DownloadFilesTask(Fragment fragment){
            mFragment = fragment;
        }
    

    错误:

        protected void onPostExecute(Long result) {
            // if the fragment has been detached, this will crash
            mFragment.getView().findView...
        }
    

    RIGHT:

        protected void onPostExecute(Long result) {
            if (mFragment !=null && mFragment.isResumed())
                ... do something on the UI thread ...
        }
    }
    
    1. 如果Activity在执行AsyncTask时死亡,它将继续运行。使用上面列出的技术,您可以通过检查启动任务的上下文的生命周期来避免崩溃。

    2. 最后,如果你有一个非常长时间运行的操作,根本不需要UI线程,你应该考虑使用Service。这是一个模糊:

    3. A Service is an application component representing either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use

答案 4 :(得分:0)

  

我的问题是我可以像使用简单的线程一样使用AsyncTask吗?

AsyncTask是android后台线程,任务将在后台完成。 AsyncTask会自动为您创建一个新的主题,因此您在doInBackground()中所做的一切都在另一个thread上。

  

如果活动或应用程序死亡,AsyncTask会发生什么   开始了吗?

AsyncTaskapplication相关,如果application销毁或完成,那么AsyncTask的所有相关application都将被终止。