9

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

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

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

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

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

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

先感谢您

4

2 回答 2

6

我通常做的事情:

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

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

于 2016-01-27T16:42:39.680 回答
0

服务接口(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:点击这里

于 2016-06-03T14:23:38.047 回答