onResponse
は非同期です。
onResponse
のようなものは、その中から返品することはできません。しかし、値を渡すか、Rxのようなもので動作するようにコードを再構成することはできます。
私を説明しましょう。したがって、コールバックを使用して必要な文字列値を渡すこともできます。
public interface RevealCourtPlaceCallbacks {
void onSuccess(@NonNull String value);
void onError(@NonNull Throwable throwable);
}
これらは、ネットワーク通話の価値を受け取りたい方は誰でも実装する必要がある方法です。メソッドはvoidを返す:あなたは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);
}
});
}
は
メソッドに渡すことで、たとえば注目すべき重要なことを、これを使用しています。コールバックを引数として渡します。これらのコールバックは、誰がメソッドを呼び出すか、呼び出し元で実装された匿名クラスとして実装する必要があります。
これにより、文字列courtName
を非同期で受信でき、値を返すことを心配する必要がなくなります。
コードを有効にすることができる別のオプションがあります。これはもう少し仕事であり、パラダイムシフトです。 Rx javaの知識も必要です。これをどうやって行うかの例をここに残しておきます。これを行うにはいくつかの方法があることに注意してください。
最初に、改造インターフェイスを別に定義する必要があります。戻り値の型は現在、観測可能である必要があります。
public interface CourtApiClient {
@GET(/*...*/)
Single<JsonObject> getUniqueCourt(/*...*/);
}
私は本当にあなたのコールの全体のインタフェースの詳細を知らないが、ここで重要な部分は、戻り値の型が今Single
です。これは1つの項目または複数のエラーしか出さない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'をサポートしています) –