如果不使用 onPostExcute,使用 AsyncTask 是不是有意义?

Posted

技术标签:

【中文标题】如果不使用 onPostExcute,使用 AsyncTask 是不是有意义?【英文标题】:Does it make sense to use AsyncTask if onPostExcute is not used?如果不使用 onPostExcute,使用 AsyncTask 是否有意义? 【发布时间】:2021-01-21 03:22:57 【问题描述】:

在我正在查看的代码 sn-p 中,使用了扩展 AsyncTask 的私有类。但是不使用onPostExecute 方法。仅使用 doInBackground 方法,并且在该方法中发出了 POST 请求。我的问题是,AsyncTask 不是用于在工作后更新 UI 吗?我的意思是在没有onPostExecute 的情况下使用它有意义吗?

(我不允许分享代码的任何部分,如果含糊不清,请见谅。)

谢谢。

【问题讨论】:

这完全取决于你的 AsyncTask 的目的。如果你觉得没有它也没关系(或者你只是因为某种原因不需要它),那么你可以把它留空。但我建议你使用 onPostExecute 来做 doInBackground 之后的过程,例如显示结果等。 @SweArmy 如果我不使用它,它的目的是什么? 这就是为什么这一切都取决于您要实现的目标。例如,如果您使用 AsyncTask 解析 JSON,您可以在 doInBackground 中进行解析并在 onPostExecute 中显示结果。 【参考方案1】:

这取决于要执行的任务。你可以完美地使用 AsyncTask 而不调用 onPostExecute,但如果它既不使用 onProgressUpdate 方法,则意味着它的用途不正确,即在后台线程中执行任务,并在 UI 线程上通知结果,在 UI 线程上通知进度更新。

因此,如果根本没有使用 onPostExecuteonProgressUpdate,那么可能应该替换为 Thread。

还要考虑 API 30 中的 AsyncTask 类 has been deprecated,因此可能是重构此类代码的好时机。

【讨论】:

谢谢,这正是我要找的。如果它不会提醒 UI,我期待使用另一个概念的建议。【参考方案2】:

是的,如果doInBackground 方法中的代码没有返回值(仅用于副作用),例如在您的情况下,它用于POST 请求,它不会返回值。

根据文档:onPostExecute(Result), invoked on the UI thread after the background computation finishes. The result of the background computation is passed to this step as a parameter.

例子:

class DownloadFilesTask extends AsyncTask<Integer, Void, Void>
 @Override
 protected Void doInBackground(Integer... integers) 
    //  DO POST REQUEST
     return null;
 

因为 ProgressResult 参数是 Void,所以您不必重写 onPostExecute(Result) 方法。

【讨论】:

是的,但问题是,为什么要使用 AsyncTask 呢?如果你不打算提醒 UI。 在这种情况下,你是对的,使用它没有意义,我只是详细说明一下,以防你一开始不知道如何使用它。而且它现在已被弃用,您可以使用 Coroutines 它也有 withContext(Dispactcher.main) 方法来实现 onPostExecute(Result) 的工作但更优雅,更有好处。

以上是关于如果不使用 onPostExcute,使用 AsyncTask 是不是有意义?的主要内容,如果未能解决你的问题,请参考以下文章

十异步

PHP Php - DÃasy mesesenespañol

Discord.py - 如果命令被编辑,让我的机器人编辑他的响应

离线时发布(React-Native)

Dart:如何在异步函数中管理并发

ajax 提交图片方法