2017-07-02 27 views
0

我想從我的函數返回一個字符串值。但我不知道如何處理它?我嘗試了最終的單一陣列解決方案,但沒有成功。我該如何返回改進版v2的響應

這裏是我的代碼:

public String revealCourtPlace(String courtID) 
{ 

    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(); 
       } 

      } 

     } 

     @Override 
     public void onFailure(Call<JsonObject> call, Throwable t) 
     { 

     } 

    }); 

    //return ? 
} 
+0

'onResponse'異步調用,即在您返回f後很可能rom' revealCourtPlace'。 –

+0

你說,有沒有辦法得到字符串值? –

+0

您需要將您的邏輯結構更具響應性,例如響應異步事件/更新。例如,看看'RxJava'('retrofit'也支持'RxJava') –

回答

6

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); 
+0

謝謝你指導答覆先生。它太神奇了。但是如何調用我的函數? revealCourtName(courtID ,?); –

+0

@YunusHaznedar我編輯了我的答案。看看它是否可以幫助你! – Fred

+0

謝謝你的指導答覆先生。它會幫助我看到我做錯了什麼。再次感謝。 –

相關問題