2016-05-08 43 views
0
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(URL).build(); 
api api = restAdapter.create(api.class); 
api.get(value, new Callback<model>(){ 

      @Override 
      public void success(model model, Response response) { 
       //get value of a here. 
       a=model.getA(); 

      } 

      @Override 
      public void failure(RetrofitError error) { 
       error.printStackTrace(); 
      } 
     }); 
Toast.makeText(getApplicationContext(),a, Toast.LENGTH_SHORT).show(); 

我想獲得價值的外部改造功能,但它是無效的。
我已經嘗試過final,但它需要先給出值(不能從getA()) 中獲得值,或者在getA()的最後得到值(但它仍然不能在外部使用,因爲它是局部變量。 )改造不能保持其自身的價值

回答

0

您的問題不在於從Retrofit獲取價值。當您執行get函數時,您試圖立即顯示Toast,但您的請求是異步的,您應該等到從服務器獲得響應。您應該更改您的代碼是這樣的:

RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(URL).build(); 
api api = restAdapter.create(api.class); 
api.get(value, new Callback<model>(){ 

      @Override 
      public void success(model model, Response response) { 
       //get value of a here. 
       a=model.getA(); 
       Toast.makeText(getApplicationContext(),a, Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       error.printStackTrace(); 
      } 
     }); 

,或者您可以使用同步請求,而不是,但至於你在主線程中,應避免使用同步請求,因爲它會導致你的應用程序凍結,並顯示ANR錯誤。

+0

非常感謝您回答我這麼快。 但我實際上需要使用外部改造的價值,而不是內部 例如我想Clicklistener使用該值,但我需要在oncreate()等其他方法上寫它以初始化其他值。 我的意思是....沒有任何方法可以在外面寫嗎?我真的不敢相信OTZ – Jimmy

+0

在回調之外使用該變量沒有問題,但是您必須確保您已經從服務器檢索到了值並在從服務器獲得任何響應之前不使用它。 –

+0

我嘗試了一下:烤麪包什麼(例如:a)從服務器獲取(在翻新過程中)。它可以工作,但是當我在外面再次打電話時,空指針會發生,並且只會向我敬酒,所以我確定服務器正常。 我不知道版本是否會引導它。 – Jimmy