等待异步任务完成其工作

bat*_*man 80 android

我对编程很新,我有些疑惑.

我有一个AsyncTask我称之为RunInBackGround.

我开始这个过程就像:

new RunInBackGround().execute();
Run Code Online (Sandbox Code Playgroud)

但是我希望等到这个调用完成它的执行,然后继续执行其他代码语句.

我怎样才能做到这一点?

有什么办法吗?

ρяσ*_*я K 124

等到这个电话完成它的执行

您将需要调用AsyncTask.get()方法来获取结果并等待doInBackground执行未完成.但如果不在Thread中调用get方法,这将冻结主UI线程.

要在UI中获得结果,请将线程开始AsyncTask为:

String str_result= new RunInBackGround().execute().get();
Run Code Online (Sandbox Code Playgroud)

  • 那么如何等待结果却没有锁定主UI线程?说代码等待结果,但同时,进度条不断滚动! (3认同)
  • @MuhammadNaderi:使用不带`get`方法的`AsyncTask`和AsyncTask`onPostExecute`方法调用它在主UI线程上提供u结果 (2认同)
  • 确定这是一种解决方法,我现在已经使用了一段时间,但有时候我需要代码等待asynctask,比如`c#`中的`await`,当然没有锁定主线程 (2认同)
  • @ρяσsρєяK谢谢,谢谢你一百万。你不知道我为这个问题花了多少钱,但是只有一个.get()它解决了(你在跟我开玩笑)只有一个.get()!!! (2认同)

Ste*_*ijn 35

虽然最佳情况下,如果您的代码可以并行运行会很好,但您可能只是使用线程,因此您不会阻止UI线程,即使您的应用程序的使用流程必须等待它.

你在这里有2个选择;

  1. 您可以在AsyncTask本身中执行您想要等待的代码.如果它与更新UI(线程)有关,则可以使用onPostExecute方法.完成后台工作后会自动调用此方法.

  2. 如果由于某种原因你被迫在Activity/Fragment/Whatever中执行它,你也可以自己制作一个自定义监听器,你可以从你的AsyncTask广播.通过使用它,你可以在Activity/Fragment/Whatever中有一个回调方法,只有当你想要它时才会被调用:也就是当你的AsyncTask用你必须等待的任何东西完成时.

  • 这是一个了不起的答案,应该是公认的答案.此处还有一个如何使用AsyncTasks实现此目的的示例:http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is -一个 (6认同)

KDe*_*kar 15

在你AsyncTask添加一个ProgressDialog像:

private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);
Run Code Online (Sandbox Code Playgroud)

你可以在onPreExecute()方法中设置setMessage :

this.dialog.setMessage("Processing..."); 
this.dialog.show();
Run Code Online (Sandbox Code Playgroud)

并在你的onPostExecute(Void result)方法中解雇你的ProgressDialog.


Xar*_*mer 13

AsyncTask有四种方法..

onPreExecute  -- for doing something before calling background task in Async

doInBackground  -- operation/Task to do in Background

onProgressUpdate  -- it is for progress Update

onPostExecute  -- this method calls after asyncTask return from doInBackground.
Run Code Online (Sandbox Code Playgroud)

你可以onPostExecute()在回来之后打电话给你doInBackground()

onPostExecute是您需要实现的.