Java 如何仅在某个异步执行完成后执行代码?

Java 如何仅在某个异步执行完成后执行代码?,java,android,kotlin,Java,Android,Kotlin,我是编程和Android开发方面的新手。在MainActivity中,我有3种异步方法从服务器获取数据,比如说调用它 getUserDataFromServer() getProductsDataFromServer() getBannersFromServer() 如果每个请求都需要1秒,那么如果我一个接一个地(串联)链接它,则需要3秒来完成这3个请求 所以我想要的是。。。。我想异步(并行)发出这3个请求,如果这3个请求已经完成(失败或成功),那么我想做其他事情,比如显示Toast消息。所以

我是编程和Android开发方面的新手。在MainActivity中,我有3种异步方法从服务器获取数据,比如说调用它

getUserDataFromServer()
getProductsDataFromServer()
getBannersFromServer()
如果每个请求都需要1秒,那么如果我一个接一个地(串联)链接它,则需要3秒来完成这3个请求

所以我想要的是。。。。我想异步(并行)发出这3个请求,如果这3个请求已经完成(失败或成功),那么我想做其他事情,比如显示Toast消息。所以我可以更快地完成,也许只需要1,2秒,而不是3秒

我不知道该怎么做,也不知道在Android中使用什么特殊方法来包装它


如何在Java或Kotlin中实现这一点?

以下代码应该可以帮助您开始使用。它还解释了正在发生的事情。您可以根据需要更改参数:

执行任务:

MyTask myTask = new MyTask();
myTask.execute(String1);

//OR:
new MyTask().execute(String1, String2, String3...);
//The first type in AsyncTask<> is for specifying the type of input given.
//Second parameter: Type of data to give to onProgressUpdate.
//Third parameter: Type of data to give to onPostExecute.
private class MyTask extends AsyncTask<String, String, String> {

    private String resp;
    ProgressDialog progressDialog;

    @Override
    protected String doInBackground(String... params) {
        publishProgress("Processing ..."); // Calls onProgressUpdate()
        //params is the input you've given that can be used for processing.

        getUserDataFromServer()
        getProductsDataFromServer()
        getBannersFromServer()

        //Result is the String to give onPostExecute when the task is done executing.
        String result = "Done Processing";
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        // Get the result from your task after it is done running.
        progressDialog.dismiss();
        //IMPORTANT: As you asked in your question, you can now execute whatever code you 
        //want since the task is done running.

    }

    @Override
    protected void onProgressUpdate(String... text) {
        //Progress has been updated. You can update the proggressDialog.       
    }
}
创建任务:

MyTask myTask = new MyTask();
myTask.execute(String1);

//OR:
new MyTask().execute(String1, String2, String3...);
//The first type in AsyncTask<> is for specifying the type of input given.
//Second parameter: Type of data to give to onProgressUpdate.
//Third parameter: Type of data to give to onPostExecute.
private class MyTask extends AsyncTask<String, String, String> {

    private String resp;
    ProgressDialog progressDialog;

    @Override
    protected String doInBackground(String... params) {
        publishProgress("Processing ..."); // Calls onProgressUpdate()
        //params is the input you've given that can be used for processing.

        getUserDataFromServer()
        getProductsDataFromServer()
        getBannersFromServer()

        //Result is the String to give onPostExecute when the task is done executing.
        String result = "Done Processing";
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        // Get the result from your task after it is done running.
        progressDialog.dismiss();
        //IMPORTANT: As you asked in your question, you can now execute whatever code you 
        //want since the task is done running.

    }

    @Override
    protected void onProgressUpdate(String... text) {
        //Progress has been updated. You can update the proggressDialog.       
    }
}
//AsyncTask中的第一个类型用于指定给定输入的类型。
//第二个参数:要提供给onProgressUpdate的数据类型。
//第三个参数:提供给onPostExecute的数据类型。
私有类MyTask扩展了AsyncTask{
私有字符串resp;
进行对话进行对话;
@凌驾
受保护的字符串doInBackground(字符串…参数){
publishProgress(“处理…”);//调用onProgressUpdate()
//params是您提供的可用于处理的输入。
getUserDataFromServer()
getProductsDataFromServer()
getBannersFromServer()
//结果是当任务完成执行时,给onPostExecute的字符串。
String result=“已完成处理”;
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//在任务运行完成后获取任务的结果。
progressDialog.disclose();
//重要提示:正如您在问题中所问的,您现在可以执行您需要的任何代码
//由于任务已在运行中完成,因此需要。
}
@凌驾
受保护的void onProgressUpdate(字符串…文本){
//进度已更新。您可以更新ProggersDialog。
}
}

嘿,Alexa。这其实并不难做到,因为有很多教程和文章解释如何做到这一点。你试过自己查吗?试着找出问题。或者。好的,谢谢@IshaanJavali,我尝试过搜索,但我不知道正确的关键字,所以我想我需要先花点时间来了解AsyncTask是的。文档肯定会对您有所帮助。