2016-12-15 18 views
0

次のAndroidプロジェクトでRetrofit 2.1.0を使いたいです。私はRetrofit onResponse()からアクティビティ/フラグメントUIを更新するにはどうすればよいですか?

すなわち、すべてのREST呼び出しの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 
} 
を別々のクラスをデザインパターンを使用しているため作成したいです

私のアクティビティ/フラグメントのUIをonResponse()からどのように更新できますか?

追加情報:
分のSDK:19
ターゲットSDK:23
OkHttpとレトロフィット2.1.0とgson

+0

を[ここで問題](http://stackoverflow.com/q/34184088/4802664)は、ありますただ1つの答えと私の問題を解決しませんでした。 –

+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)がシングルトンである多くの例も見てきましたが、それはなぜですか?私はsingleton restrofit(RestAdapter)に関する質問をしました。私はなぜretrofitがsingletonであるのか、retrofit singletonを作るメリットは何ですか?残念ながら私の質問は不明瞭で、削除されました。その後、私は数日間の質問をすることができなかった –

0

に、このようなインターフェイスを作成します。あなたのBalanceRestClient

public interface BalanceListener { 

    void onUserAvailable(User user); 

} 

は、そのインスタンスを持っています。そして onResponse に:あなたの活動は、BalanceListner実装してください

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

     User user = response.body(); 

     listener.onUserAvailable(user); 

    } 

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

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

私も同様のアプローチについて考えていました。デザインパターンに関しては、どのデザインパターンがパフォーマンス面で最も良いかを示唆することができます。最後のプロジェクト私は自分自身のライブラリ+ファクトリデザインパターンを使用しました。 –

+0

@HassanMakarov私は最適なパフォーマンスのための最良のデザインパターンはないと信じています。 MVP/MVCパターンを使用することはできますが、やはりコードが遅くて遅いです。一方、パターンを使用せず、優れたパフォーマンスを得ることができます。パフォーマンスは100000ものに依存します。しかし、コードをきれいに整え、構造が整っており、容易にスケーラビリティを保ち、バグを比較的簡単に見つけたい場合は、上記のパターンのいくつかを使用してください。私はMVPを好む。 Singleton/Factory/Builder /などのパターン(現在のニーズに依存します)と組み合わせることができます。 –

関連する問題