如何使用改型2将Android中的应用程序逻辑与网络层分离

如何使用改型2将Android中的应用程序逻辑与网络层分离,android,rest,retrofit,retrofit2,Android,Rest,Retrofit,Retrofit2,我是安卓系统的新手,我面临一个问题 我想让我的“ServerCommunication”类(singelton)完成所有的改造,并在REST调用完成时提供公共方法 我想在我的活动中使用这个“ServerCommunication”实例来调用Rest服务,但仅此而已。应用程序逻辑应该在活动中完成。因此,通过这种方式,一些活动登录调用“ServerCommunication”中的方法登录(POJORequest),其中通过改造框架执行实际的REST调用,并返回一些POJOResponse。因此,活动

我是安卓系统的新手,我面临一个问题

我想让我的“ServerCommunication”类(singelton)完成所有的改造,并在REST调用完成时提供公共方法

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

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

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

在安卓系统中,改型2的模式是什么

提前感谢您

我通常做的事情:

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

服务接口(IPhotoService):

@GET(“/photos/kudos”)
调用fetchKudos(@Header(“Authorization”)字符串授权,
@查询(“偏移量”)int offset、@Query(“mt”)boolean mt);
服务impl(PhotoService):

private goaprovider mGoProvider=new goaprovider();
公共允诺者获得荣誉(){
返回新的Promiser((解决、拒绝)->
mGoProvider.getService(IPhotoService.class).fetchKudos(mSession.getToken(),
mOffsetKudos,true).排队(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
PhotoParser JSON=新的PhotoParser();
试一试{
mOffsetKudos=mOffsetKudos+20;
resolve.run(JSON.photosFromJson(response.body());
}捕获(JSONException e){
Log.e(“fetchKudos”,e.toString());
}
}否则{
拒绝.run(新的HttpError(response.code(),response.message());
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
拒绝.run(新的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);
}
private void loadPhoto(){
新建PhotoService().fetchKudos()
.success(this::resultsucceed)
.error(此::resultorror);
}
私人作废结果成功(列出照片){
mphotodapter.setItems(照片);
}
私有无效结果错误(HttpError HttpError){
httpErrorToast(httpError);
}

如果您想使用Promizer:

谢谢您的回答。EventBus成功了,但我仍然觉得这更像是一种变通方法。我仍然必须将onEventMainThread()包含到活动中,在该活动中,我从ServiceAPImplementor(或我们对其进行ACL的任何内容)接收响应,并且UI实际上没有被阻止,尽管我们将其隐藏在某个进度对话框后面或只是简单地禁用控件。我希望避免添加额外的事件模式框架,因为我只想在ServiceAPImplementor中使用方法SomeResponse callRestService(SomeRequest req),并在activity中使用它的实例,然后执行类似SomeResponse resp=serv.callRestService(req)的操作;改型2可以配置连接和其他超时,因此阻止用户界面不是问题。所以我想最好的解决方案是,我可以选择何时从UI线程调用REST,何时从后台调用REST。当我只是在activity中实现回调方法并从ServiceAPImplementor中的onResponse或onFailure方法调用它时,使用EventsBus而不是解决方案有什么好处吗?如果这样做了,您介意给我一次投票吗?如果这至少有帮助的话。ThanksEventbus会随着项目的发展而变得混乱,因为基本上每个人都在对其他人大喊大叫。很难追踪到底是谁在和谁交流。另一种选择是使用RxJava和h
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);
}