【发布时间】:2018-07-18 12:57:09
【问题描述】:
我需要返回值uId。我在onResponse() 函数内的第一个日志语句中得到了正确的值。但是当涉及到 return 语句时,它返回 null。
我认为 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 值之前运行
-
可能
Callback稍后会被执行,因此在执行线程到达return的时刻,Callback尚未执行。 -
你的方法调用是异步的。 IMO 最好的方法是使
getNumber()方法异步:而不是返回一个值,而是让getNumber()接受一个回调方法并在onResponse()的末尾调用它。 -
我知道它在另一个线程中。我需要知道是否有任何方法可以让主线程等到 onResponse() 完成。就像我们在 java 中做 thread.join() 一样
-
@AbhijithK - 通常你会向用户显示一些正在完成的后台工作(例如进度条)。但是您不应该阻止用户界面。您可以禁用某些 UI 元素,直到您的回调(请参阅答案)获得所需的数据。但是“等待”会冻结 UI,这是禁忌。查看guidelines 以了解预期的行为类型。