【问题标题】:How to separate application logic from network layer in Android using Retrofit 2如何使用 Retrofit 2 在 Android 中将应用程序逻辑与网络层分离
【发布时间】:2023-03-16 02:34:01
【问题描述】:

我是 Android 和 Retrofit 的新手,我正面临一个问题。

我想让我说“ServerCommunication”类(singelton),所有改造魔法都在其中完成,并且它将具有完成 REST 调用的公共方法。

我想在我的活动中使用这个“ServerCommunication”实例来调用 Rest 服务,但仅此而已。应用程序逻辑应该在活动中完成。因此,通过这种方式,一些活动登录在“ServerCommunication”中调用方法 Login(POJORequest),其中通过改造框架完成了实际的 REST 调用并返回了一些 POJOResponse。所以 Activity 不关心 REST 通信,而 ServerCommunication 不关心什么逻辑应该应用于来自 REST 服务的响应。

对于改造 2,我不明白如何阻止 Activity 等待改造的响应以及如何将其返回。好吧,我可能认为我可以在活动中使用一些回调方法,以便可以从 OnPostExecute() 中的“ServerCommunication”调用这些方法,以根据响应中的数据应用一些逻辑。只是我认为它应该是更简单的方法。

好吧,为了澄清上面的所有这些混乱,想象一下简单的情况:您的主要活动中有数据,您将这些数据传递给完成 REST 调用并接收响应的通信类。必须验证此响应才能继续。并且您希望在主要活动中而不是在通信类中完成此验证。

在 Android 中使用 Retrofit2 的模式是什么?

提前谢谢你

【问题讨论】:

    标签: android rest retrofit retrofit2


    【解决方案1】:

    我通常会做什么:

    • 创建您的界面(您拥有所有 REST 方法 - GET 和 POST 等)
    • 创建一个使用相应方法进行实际调用的类(请参阅接口 REST 方法)。我会称它为 ServiceAPIImplementor 之类的东西。这是您实际创建 Retrofit 适配器的地方。
    • 在您的活动中,创建您的实现类的实例并调用方法并传递预期的参数。
    • 调用方法后,您可能应该显示一个进度对话框,让用户知道正在发生的事情。
    • 当调用 onResponseonFailure 方法时,使用事件模式(EventBus 库?)通知活动网络操作已完成。 Activity 收到通知后,应关闭进度对话框并相应地更新 UI - 使用新收到的数据或完成的操作(预期结果)。

    我希望这可以帮助您更接近您想要实现的目标!

    【讨论】:

    • 感谢您的回答。好吧,EventBus 成功了,但我仍然觉得它更像是解决方法。我仍然必须将 onEventMainThread() 包含到我从 ServiceAPIImplementor(或我们所调用的任何内容)接收响应的活动中,并且 UI 实际上没有被阻止,尽管我们将它隐藏在一些进度对话框后面或只是简单地禁用控件。当我只想在 ServiceAPIImplementor 中使用方法 SomeResponse callRestService(SomeRequest req) 时,我想避免添加额外的事件模式框架
    • 并简单地在活动中拥有它的实例并执行 SomeResponse resp=serv.callRestService(req); 之类的操作Retrofit 2 可以配置连接和其他超时,因此阻塞 UI 不是问题。所以我想最好的解决方案是如果我可以选择何时从 UI 线程和何时从后台进行 REST 调用。
    • 但是,如果不可能,我会坚持使用 EventBus 解决方案,但我有一个问题。当我只是简单地在活动中实现回调方法并从 ServiceAPIImplementor 中的 onResponse 或 onFailure 方法调用它时,使用 EventsBus 是否有任何好处?
    • 如果成功了,你介意给一个赞成票吗?也就是说,如果它至少有帮助的话。谢谢
    • 随着项目的发展,Eventbus 可能会令人困惑,因为基本上每个人都会对其他人大喊大叫。很难跟踪谁实际上在与谁交流。另一种选择是使用 RxJava 并让您的实现者返回您的对象的 Observable。 RxJava 的学习曲线一开始可能会很陡峭,但这将是一个很好的起点(没有映射或其他修饰符方法等,只是发出值)。
    【解决方案2】:

    服务接口(IPhotoService):

    @GET("/photos/kudos")
    Call<String> fetchKudos(@Header("Authorization") String authorization,
                            @Query("offset") int offset, @Query("mt") boolean mt);
    

    服务实现(PhotoService):

    private GoApiProvider<IPhotoService> mGoProvider = new GoApiProvider<>();
    
    public Promiser<List<Photo>, HttpError> fetchKudos() {
        return new Promiser<>((resolve, reject) ->
                mGoProvider.getService(IPhotoService.class).fetchKudos(mSession.getToken(),
                        mOffsetKudos, true).enqueue(new Callback<String>() {
                    @Override
                    public void onResponse(Call<String> call, Response<String> response) {
                        if (response.isSuccessful()) {
                            PhotoParser JSON = new PhotoParser();
                            try {
                                mOffsetKudos = mOffsetKudos + 20;
                                resolve.run(JSON.photosFromJson(response.body()));
                            } catch (JSONException e) {
                                Log.e("fetchKudos", e.toString());
                            }
                        } else {
                            reject.run(new HttpError(response.code(), response.message()));
                        }
                    }
    
                    @Override
                    public void onFailure(Call<String> call, Throwable t) {
                        reject.run(new HttpError(YPErrorType.Undefined.getType(), t.getMessage()));
                    }
                })
        );
    }
    

    活动或片段:

    private void loadPhoto() {
        new PhotoService().fetchKudos()
                .success(this::resultSucceeded)
                .error(this::resultError);
    }
    
    private void resultSucceeded(List<Photo> photos) {
        mPhotoAdapter.setItems(photos);
    }
    
    private void resultError(HttpError httpError) {
        httpErrorToast(httpError);
    }
    

    如果你想使用 Promizer:Click here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2019-07-23
      • 1970-01-01
      • 2012-12-21
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多