使用 AsyncTask.execute().get() 显示 ProgressBar

show ProgressBar with AsyncTask.execute().get()

我想在 运行 我的 Asynctask 中的代码中显示不确定的 ProgressBar,但是(如果我是对的)因为我在 MainActivity 中使用 .get() 函数 UI-线程冻结,直到 AsyncTask 给出响应,因此不会显示 ProgressBar。当 UI-thread 正在等待 Asynctask 完成和 return 一些值时,我怎样才能使 ProgressBar 出现在屏幕上?

主要活动

public class MainActivity extends AppCompatActivity {
ProgressBar progressBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);
}

public void showSpinner(View view){
    CustomAsyncTask customAsyncTask = new CustomAsyncTask(this);
    customAsyncTask.setProgressBar(progressBar);
    try {
        String message = customAsyncTask.execute().get();
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Toast.makeText(this,
            "Time is up", Toast.LENGTH_LONG).show();
}}

异步任务

public class CustomAsyncTask extends android.os.AsyncTask<Void, Void, String> {

Context context;
CustomAsyncTask(Context ctx) {
    context = ctx;
}

ProgressBar progressBar;
public void setProgressBar(ProgressBar progressBar) {
    this.progressBar = progressBar;
}

@Override
protected String doInBackground(Void... voids) {
    SystemClock.sleep(2000);
    String message = "hello world";
    return message;
}

@Override
protected void onPreExecute() {
    progressBar.setVisibility(View.VISIBLE);
}

@Override
protected void onPostExecute(String message) {
    progressBar.setVisibility(View.GONE);
}}

尝试 运行 AsyncTask 没有 .get()

您可以使用接口(see original answer):

您的界面:

public interface OnTaskCompleted{
    void onTaskCompleted();
}

你的Activity:

public MainActivity extends AppCompatActivity implements OnTaskCompleted{
    //your MainActivity
}

还有你的 AsyncTask:

public class CustomAsyncTask extends android.os.AsyncTask<Void, Void, String> {
    private OnTaskCompleted listener;

    public CustomAsyncTask(OnTaskCompleted listener){
        this.listener=listener;
    }

    //required methods

    protected void onPostExecute(Object o){
        //your stuff
        listener.onTaskCompleted();
    }
}

另一种方法是在MainActivity中为message添加setter:

public class MainActivity extends AppCompatActivity {
//...
private String message;
public void setMessage(String message) {
    this.message = message;
}
// ...
customAsyncTask.execute();

然后只需在 CustomAsyncTask 中更新 .onPostExecute() 中的 message:

public class CustomAsyncTask extends android.os.AsyncTask<Void, Void, String> {
//...
@Override
protected void onPostExecute(String message) {
    progressBar.setVisibility(View.GONE);
    MainActivity activity = (MainActivity) context;
    activity.setMessage(message);
}