如何使用 Retrofit 2 在 Android 中将应用程序逻辑与网络层分离

How to separate application logic from network layer in Android using Retrofit 2

我是 Android 和 Retrofit 的新手,我遇到了一个问题。

我想让我说 "ServerCommunication" class (singelton),其中所有 Retrofit 魔法都已完成,它将有 public 方法,其中 REST 调用已完成。

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

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

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

在 Android 中使用 Retrofit2 执行此操作的模式是什么?

提前致谢

我通常做的事情:

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

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

服务接口(IPhotoService):

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

服务实现(照片服务):

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

Activity 或片段:

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