【问题标题】:How can I update Activity/Fragment UI from Retrofit onResponse()?如何从 Retrofit onResponse() 更新 Activity/Fragment UI?
【发布时间】:2017-04-30 19:28:25
【问题描述】:

我想在我的下一个 Android 项目中使用 Retrofit 2.1.0。我想使用设计模式,因此为每个 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 
}  

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

附加信息:
最小 SDK:19
目标 SDK:23
使用 OkHttp 和 gson 改造 2.1.0

【问题讨论】:

标签: java android rest retrofit2


【解决方案1】:

制作这样的界面:

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

  }

让您的 Activity 实现 BalanceListner

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

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

【讨论】:

  • 我也在考虑类似的方法。关于设计模式,您能否提供一些关于哪种设计模式在性能方面最好的提示。上一个项目我使用了自己的库 + 工厂设计模式。
  • @HassanMakarov 我相信没有最佳设计模式可以实现最佳性能。您可以使用 MVP / MVC 模式,但仍然编写草率且缓慢的代码。另一方面,您可以不使用任何模式并获得出色的性能。性能取决于 100000 件事情。但是如果你想保持你的代码干净、结构良好、易于扩展并且相对容易地发现错误,那么使用上面提到的一些模式。我更喜欢MVP。您可以将它们与 Singleton / Factory / Builder / 等模式结合使用(这取决于您当前的需求)。
【解决方案2】:
 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..)。

【讨论】:

  • 不错。但我对单身人士感到困惑。如果我在不同的活动中多次使用 BalanceRestClient 会怎样。创建多个 BalanceRestClient 实例而不是单例有什么问题?
  • 它不划算。如果您已经这样做了,为什么还要一次又一次地创建?
  • 我也看到了很多改造(RestAdapter)是单例的例子,这是为什么呢?我问了关于单件改造(RestAdapter)的问题,即为什么改造是单件,制作改造单件有什么好处,如果我在单个活动中创建多个改造实例会怎样。但不幸的是,我的问题被标记为不清楚并被删除。之后我几天都不能问问题
  • @RoberBanyai 我想使用设计模式。有一个热门话题:单例“反模式”
  • 因为如果你以前做过的话,再建立一个新的距离是没有意义的。使用单例,您可以将实例保存在内存中,并且可以随时访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多