等到异步任务完成工作


84

我对编程非常陌生,我对此有些怀疑。

我有一个AsyncTask,我称之为RunInBackGround

我开始像这样的过程:

new RunInBackGround().execute();

但是我希望等到此调用完成执行之后,再继续执行其他代码语句。

我怎样才能做到这一点?

有什么办法吗?


2
AsyncTask的要点是它是异步的,这意味着它与其余代码未同步。
Gjordis

3
您可以使用AsyncTask方法的onPostExecute()获取类中的回调。
DcodeChef

5
您真的不想等到完成。您要知道何时完成。
njzk2

3
@DcodeChef是唯一了解他在问题中想要的人。
Please_Dont_Bully_Me_SO_Lords 2014年

Answers:


129

等到此调用完成执行

您将需要调用AsyncTask.get()方法以返回结果,并等待直到doInBackground执行完成。但这会冻结Main UI线程,如果您不调用Thread内部的get方法

要在UI Thread中返回结果,请启动AsyncTask为:

String str_result= new RunInBackGround().execute().get();

3
因此,如何等待结果而不锁定主UI线程?说代码等待结果,但与此同时,进度条不断滚动!
穆罕默德·纳德里

2
@MuhammadNaderi:使用AsyncTaskget方法和的AsyncTaskonPostExecute方法称为U导致对主UI线程,其提供
ρяσѕρєяķ

3
确保这是一种解决方法,我已经使用了一段时间,但是有时我需要代码来等待asynctask,例如awaitin c#,并且当然不会锁定主线程
Muhammad Naderi 2015年

2
@ρяσsρєяK谢谢,谢谢你一百万。你不知道我为这个问题花了多少钱,但是只有一个.get()它解决了(你在跟我开玩笑)只有一个.get()!!!!!
Code_Worm '16

如何使用AsyncTask并避免使用get()来避免UI冻结?
Arjun Issar

37

尽管最佳的方式是代码可以并行运行,但这可能是您只使用线程的情况,因此即使应用程序的使用流程必须等待它也不会阻塞UI线程。

您这里有2种选择;

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

  2. 如果由于某种原因您被迫在“活动” /“片段” /“无论如何”中执行此操作,则还可以使自己成为自定义侦听器,并通过AsyncTask进行广播。通过使用此方法,您可以在Activity / Fragment / Whatever中有一个仅在需要时才被调用的回调方法:aka当您的AsyncTask完成后,您需要等待的所有内容。


6
这是一个了不起的答案,应该被接受。这也是如何使用AsyncTasks实现此目的的示例:stackoverflow.com/questions/12575068/…–
Jose Gonzalez

在第二种选择中,平均而言,当您向接收者抛出意图时,主线程将恢复正确。OP不需要那个。
LincyTonita '18

16

在您AsyncTask添加一个ProgressDialog,如:

private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);

您可以使用以下onPreExecute()方法设置setMessage :

this.dialog.setMessage("Processing..."); 
this.dialog.show();

然后用你的onPostExecute(Void result)方法解雇你ProgressDialog


15

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.

onPostExecute()从回来后,您可以呼叫您的工作doInBackground()

onPostExecute是您需要实现的。


1

我认为最简单的方法是创建一个接口以从onpostexecute获取数据并从interface运行Ui:

创建一个接口:

public interface AsyncResponse {
    void processFinish(String output);
}

然后在asynctask中

@Override
protected void onPostExecute(String data) {
    delegate.processFinish(data);
}

然后在您的主要活动中

@Override
public void processFinish(String data) {
     // do things

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.