2017-01-23 53 views
0

我創建了一個類calls.enqueue,它應該返回其在onResponse收到json執行語句,改造

類:

class EnqueueCalls 
{ 
    private static JSONObject object = new JSONObject(); 
    JSONObject enqueue(Call<ResponseBody> calls, final Boolean jsonExist, final Context context) 
    { 
     calls.enqueue(new Callback<ResponseBody>() 
     { 
      @Override 
      public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) 
      { 
         object = new JSONObject(response.body().string()); 
      } 

      @Override 
      public void onFailure(Call<ResponseBody> call, Throwable t) { 
       Log.e(TAG, "Exception :: " + t.toString()); 
      } 
     }); 

     Log.e(TAG, "I'm not in enqueue" + object); //when this method is called, control is coming here first 
     return object; 
    } 

當我調用此方法,則返回空object,然後執行calls.enqueue,並將json值分配給object

如何返回在onResponse中分配的object值?

基本上,我希望執行calls.enqueue後執行return語句。

我已經試過:

void enqueues(Call<ResponseBody> calls, final Boolean jsonExist, final Context context) 
{ 
    calls.enqueue(new Callback<ResponseBody>() 
    { /*get json here*/ } 
} 

JSONObject getObject() { 
    return object; 
} 

並把它稱爲

enqueueCalls.enqueues(calls, true, this); 
object = enqueueCalls.getObject(); 

不過我得到空的對象。

+0

排隊是異步的,這就是爲什麼你有回調,回調代碼只在網絡請求完成後才執行。 – Bhargav

+0

是啊@巴加夫我應該怎麼做才能返回'onResponse' – Prabs

+0

你不明白一些基本的東西,你在回調中寫的代碼發生在你的函數完成執行後(甚至可能是後來,不知道什麼時候它會運行那個點),所以沒有'returns'這樣的東西,每當網絡請求完成時你需要執行需要服務器發送的對象的代碼,所以無論代碼依賴於什麼關於對象的數據,你需要把它放在回調中。 – Bhargav

回答

0

而不是返回json在同一類中處理json是 不錯的選擇。

因此,只有在onResponse中才能處理響應。

我打電話給方法handleResponse(callBackResponse),它將通過使用收到的響應來處理標題,json等。

原因:

無法控制的響應時間和回調方法執行。我們不能說它先執行calls.enqueue,然後執行return語句。

期待更好的解決方案,如果存在。