如何等待异步方法

2022-06-29 00:00:00 android java retrofit2
我需要返回值uId。我在onResponse()函数内的第一个LOG语句中获得了正确的值。但当涉及到RETURN语句时,它返回空。

我认为onResponse()正在另一个线程上运行。如果是这样,如何使getNumber()函数等待onResponse()函数执行完毕。(如thread.Join())

或者是否有其他解决方案?

编码:

String uId;
public String getNumber() {

    ApiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class);
    Call<TopLead> call = apiInterface.getTopLead();
    call.enqueue(new Callback<TopLead>() {
        @Override
        public void onResponse(Call<TopLead> call, Response<TopLead> response) {
            String phoneNumber;
            TopLead topLead = response.body();
            if (topLead != null) {
                phoneNumber = topLead.getPhoneNumber().toString();
                uId = topLead.getUId().toString();
                //dispaly the correct value of uId
                Log.i("PHONE NUMBER, UID", phoneNumber +", " + uId);
                onCallCallback.showToast("Calling " + phoneNumber);
            } else {
                onCallCallback.showToast("Could not load phone number");
            }
        }

        @Override
        public void onFailure(Call<TopLead> call, Throwable t) {
            t.printStackTrace();
        }
    });
    //output: Return uid null
    Log.i("Return"," uid" + uId);
    return uId; 

解决方案

您的方法执行异步请求。因此,操作"Return Uid;"不会等到您的请求完成,因为它们位于不同的线程上。

我可以推荐几种解决方案

  1. 使用接口回调

     public void getNumber(MyCallback callback) {
       ...
        phoneNumber = topLead.getPhoneNumber().toString();
        callback.onDataGot(phoneNumber);
     }
    

您的回调接口

     public interface MyCallback {

        void onDataGot(String number);
     }

最后,调用该方法

getNumber(new MyCallback() {
    @Override
    public void onDataGot(String number) {
    // response
    }
});
  1. 使用kotlin(我认为是时候使用kotlin而不是Java:)

    fun getNumber(onSuccess: (phone: String) -> Unit) {
      phoneNumber = topLead.getPhoneNumber().toString()
      onSuccess(phoneNumber)
    }
    

调用该方法

    getNumber {
      println("telephone $it")
    }

相关文章