如果不使用 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 线程上通知进度更新。
因此,如果根本没有使用 onPostExecute 或 onProgressUpdate,那么可能应该替换为 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;
因为 Progress 和 Result 参数是 Void
,所以您不必重写 onPostExecute(Result)
方法。
【讨论】:
是的,但问题是,为什么要使用 AsyncTask 呢?如果你不打算提醒 UI。 在这种情况下,你是对的,使用它没有意义,我只是详细说明一下,以防你一开始不知道如何使用它。而且它现在已被弃用,您可以使用 Coroutines 它也有 withContext(Dispactcher.main) 方法来实现 onPostExecute(Result) 的工作但更优雅,更有好处。以上是关于如果不使用 onPostExcute,使用 AsyncTask 是不是有意义?的主要内容,如果未能解决你的问题,请参考以下文章
PHP Php - DÃasy mesesenespañol