2016-12-15 64 views
0

我想爲我的下一個Android項目使用Retrofit 2.1.0。我想用設計模式,並因此創造單獨的類爲每個REST調用即如何從改造onResponse()更新Activity/Fragment UI?

IBalanceService.java

public Interface IBalanceService{ 
    @GET("users/{username}") 
    void getUser(@Path("username") String username, Callback<User> cb); 
} 

BalanceRestClient.java

public class BalanceRestClient{ 

    String username = "Makarov"; 

    Retrofit retrofit = new Retrofit.Builder() 
           .baseUrl("http://hovermind.com") 
           .addConverterFactory(GsonConverterFactory.create()) 
           .addCallAdapterFactory(rxAdapter) 
           .build(); 

    IBalanceService bs = retrofit.create(IBalanceService.class); 


    Call<User> call = apiService.getUser(username); 
    call.enqueue(new Callback<User>() { 

     @Override 
     public void onResponse(Call<User> call, Response<User> response) { 

      User user = response.body(); 

      // update Activity/Fragment from here 

     } 

     @Override 
     public void onFailure(Call<User> call, Throwable t) { 
     // Log error here since request failed 
     } 

    }); 
} 

BalanceActivity.java

public BalanceActivity extends Activity{ 

    // BalanceRestClient will update some UI elements 
} 

如何從onResponse()更新我Activity/fragment中的UI?

附加信息:
分鐘SDK:19
目標SDK:23
改造2.1.0與OkHttp和GSON

+0

有一個[問題在這裏(http://stackoverflow.com/q/34184088/4802664)但只有一個答案,它並沒有解決我的問題。 –

+0

檢查http://stackoverflow.com/a/40957059/4247543 –

回答

1
public class BalanceRestClient { 

      private static BalanceRestClient instance; 
      private IBalanceService request; 

      private BalanceRestClient() { 
       Retrofit retrofit = new Retrofit.Builder() 
         .baseUrl("http://hovermind.com") 
         .addConverterFactory(GsonConverterFactory.create()) 
         .addCallAdapterFactory(rxAdapter) 
         .build(); 

       request = retrofit.create(IBalanceService.class); 
      } 

      public static synchronized BalanceRestClient getInstance() { 
       if (instance == null) 
        instance = new BalanceRestClient(); 

       return instance; 
      } 

      public void getRequest(String userName, YourCustomeCallback callback) { 

       Call<User> call = apiService.getUser(username); 
       call.enqueue(new Callback<User>() { 

        @Override 
        public void onResponse(Call<User> call, Response<User> response) { 

         User user = response.body(); 

         callback.onResponse(user); 

        } 

        @Override 
        public void onFailure(Call<User> call, Throwable t) { 
         // Log error here since request failed 
        } 

       }); 
      } 
     } 
  1. 創建一個單獨的類。它的初始化請求只有一次。
  2. 創建一個自定義回調,它將回復您對UI的響應。
  3. 調用BalanceRestClient.getInstance.getRequest(params ..)要使用它的位置。
+0

不錯。但我對單身人士感到困惑。如果我在不同的活動中多次使用BalanceRestClient,該怎麼辦?創建BalanceRestClient的多個實例而不是單例的問題是什麼? –

+0

它不具有成本效益。爲什麼你想再次創建,如果你已經做過了,又一次? –

+0

我還看到很多例子,其中retrofit(RestAdapter)是單例,爲什麼?我問了關於單身改造(RestAdapter)的問題I.e爲什麼改造是單身,改造單身的好處是什麼,如果我在單個活動中創建多個改造實例,會發生什麼?但不幸的是我的問題被標記爲不清楚和刪除。之後我幾天不能問問題 –

0

上做一個接口,這樣的:

public interface BalanceListener { 

    void onUserAvailable(User user); 

} 

在你BalanceRestClient有它的一個實例。而在onResponse

@Override 
    public void onResponse(Call<User> call, Response<User> response) { 

     User user = response.body(); 

     listener.onUserAvailable(user); 

    } 

讓您的活動實施BalanceListner

public class BalanceActivity extends Activity implements BalanceListener { 
       ...... 

     @Override 
     public void onUserAvailable(User user) { 
      // update user views here 
     } 
    } 
+0

我也在考慮類似的方法。關於設計模式,您能否提供一些關於哪種設計模式在性能方面最佳的暗示。上一個項目我使用了我自己的庫+工廠設計模式。 –

+0

@HassanMakarov我相信沒有最佳性能的最佳設計模式。您可以使用MVP/MVC模式,並仍然編寫草率和慢速代碼。另一方面,你可以使用任何模式,並有很好的表現。性能取決於10萬件事情。但是,如果你想保持你的代碼簡潔,結構良好,易於擴展和發現的缺陷相對容易,然後用上面提到的一些模式。我更喜歡MVP。您可以將它們與Singleton/Factory/Builder /等模式組合(取決於您當前的需求)。 –