1

我知道AsyncTask不适合长过程。他们的主要目标是减轻 UI 线程的负担并在后台做一些事情。稍后完成更新相应的UI 线程

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

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

如果启动它的 Activity 或 Application 死亡,AsyncTask会发生什么?

要求

我不需要更新任何 UI。

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

4

5 回答 5

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();
    }
于 2013-04-09T13:51:12.717 回答
2

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

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

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

于 2013-04-09T13:40:52.760 回答
1

即使应用程序被杀死或崩溃,它仍然在后台启动。

于 2013-04-09T13:29:08.687 回答
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 时正确和错误的方法:

使用 Activity 的 ref 创建任务,以便在完成后执行某些操作:

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...
    }

对:

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

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

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

于 2013-04-09T15:15:55.323 回答
0

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

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

如果启动它的 Activity 或 Application 死亡,AsyncTask 会发生什么?

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

于 2013-04-09T13:32:25.790 回答