onResponse
是異步的,因此將revealCourtPlace
返回之後最有可能完成。
你不能從onResponse
那裏返回任何東西。但是,您可以將值提高或重構代碼,以便與Rx一樣工作。
讓我解釋一下。所以,一種選擇是將您想要的字符串值與回調一起傳遞。假設你有接口:
public interface RevealCourtPlaceCallbacks {
void onSuccess(@NonNull String value);
void onError(@NonNull Throwable throwable);
}
這些是誰想要接收你的網絡呼叫的價值必須實現的方法。您可以通過它傳遞給方法revealCourtPlace
public void revealCourtPlace(String courtID, @Nullable RevealCourtPlaceCallbacks callbacks)
{
BaseService.getInstance()
.getUniqueCourt(Session.getToken(),courtID)
.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response)
{
JsonObject object = response.body();
boolean success = object.get("success").getAsBoolean(); //json objesinde dönen success alanı true ise
if (success)
{
JsonArray resultArray = object.get("data").getAsJsonObject().get("result").getAsJsonArray();
for (int i = 0; i < resultArray.size(); i++)
{
JsonObject jsonInfoResult = resultArray.get(i).getAsJsonObject();
String courtName=jsonInfoResult.get("name").getAsString();
if (callbacks != null)
calbacks.onSuccess(courtName);
}
}
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t)
{
if (callbacks != null)
callbacks.onError(t);
}
});
}
重要的事情需要注意用這個例子:該方法返回void。您將回調作爲參數傳遞。這些回調必須由誰調用方法來實現,或者作爲在調用點上實現的匿名類來實現。
這使您能夠異步接收字符串courtName
,而不必擔心返回值。
還有另一種選擇,你可以讓你的代碼反應。這是更多的工作和範式的轉變。它還需要Rx java的知識。我會在這裏留下一個如何做到這一點的例子。請記住,有幾種方法可以做到這一點。
首先,你應該定義不同的改造界面。返回類型現在必須是可觀察到的:
public interface CourtApiClient {
@GET(/*...*/)
Single<JsonObject> getUniqueCourt(/*...*/);
}
我真的不知道你的電話的整個界面細節,但這裏的重要組成部分,是現在的返回類型爲Single
。這是一個只發出一個項目或錯誤的Rx可觀察項。該類型也應該是JsonObject
以外的其他類型,但從代碼中很難判斷它應該是什麼。無論如何,這也會起作用。
下一步是簡單地從你的revealCourtPlace
方法返回結果:
public Single<JsonObject> revealCourtPlace(String courtID, @Nullable RevealCourtPlaceCallbacks callbacks)
{
return BaseService.getInstance()
.getUniqueCourt(Session.getToken(),courtID);
}
這裏的關鍵區別在於,現在返回一個可觀察的,只要你想,你可以訂閱。這使得流看上去是同步的,儘管它實際上是異步的。
您現在可以選擇將JsonObject
映射到您想要的幾個字符串,或者在您的訂戶中執行解析。
編輯
既然你在評論中問道,你怎麼稱呼在這裏你的函數是一種可能性:
revealCourtPlace("some court id", new RevealCourtPlaceCallbacks() {
@Override
public void onSuccess(@NonNull String value) {
// here you use the string value
}
@Override
public void onError(@NonNull Throwable throwable) {
// here you access the throwable and check what to do
}
});
或者你可以調用的類實現這些回調和簡單地傳遞this
:
revealCourtPlace("some court id", this);
'onResponse'異步調用,即在您返回f後很可能rom' revealCourtPlace'。 –
你說,有沒有辦法得到字符串值? –
您需要將您的邏輯結構更具響應性,例如響應異步事件/更新。例如,看看'RxJava'('retrofit'也支持'RxJava') –