当前位置: 首页 > 知识库问答 >
问题:

Android改装设计模式

楚翰
2023-03-14

我正在使用改装与我的REST API交互,并且想知道是否有人有任何设计建议。

我的应用程序包含以下软件包:

  1. 模型
  2. 服务
  3. 活动
  4. 片段

服务包包含了改造的接口。例如:

public interface FooService {
    @FormUrlEncoded
    @POST("foo/do")
    @Headers("Content-Type: application/x-www-form-urlencoded; charset=UTF-8")
    Call<FooBar> do();
}

模型包含。。。嗯,不同的型号。例如,FooBar。到目前为止一切都很好——正如改装文档所示。

我已经创建了一个API类,它处理Retromet构建逻辑(Retromet的改造=new的改造。Builder()etc),并公开一个静态字段:改装。在我的活动中,我可以按照以下方式执行我的请求:

FooService service = API.retrofit.create(FooService.class);
Call<FooBar> call = service.do();

try {
    retrofit2.Response response = call.execute();
    // ...do stuff...
} catch(IOException) {}

我的问题是:进一步抽象上述内容是否更好?这样我就不需要到处重复上面的内容了?例如:

MyOtherFooService service = new  MyOtherFooService();
FooBar fooBar = service.do();

有什么想法吗?建议?

共有2个答案

吕奇
2023-03-14

我会说不要这样做。特别是因为大多数调用都需要使用异步。排队并以不同的方式处理错误响应。

您可以创建自己的抽象改造回调类,并从中抽象出“自定义”回调,这样就可以避免代码重复。

但一般来说,我希望看到应用程序逻辑在我发出请求的同一位置处理响应。

不要陷入过度思考的陷阱,或者应用一些不适合Android的滥用模式。

如果你真的需要从你的活动/片段中传递响应,只需使用RxJava甚至LocalBroadcast。也试着阅读改装书。

巫马磊
2023-03-14

我通常使用以下结构的单例模式:

首先定义ServiceHelper,如下所示:

public class ServiceHelper {

private static final String ENDPOINT = "http://test.com";

private static OkHttpClient httpClient = new OkHttpClient();
private static ServiceHelper instance = new ServiceHelper();
private IPlusService service;


private ServiceHelper() {

    Retrofit retrofit = createAdapter().build();
    service = retrofit.create(IPlusService.class);
}

public static ServiceHelper getInstance() {
    return instance;
}

private Retrofit.Builder createAdapter() {

    httpClient.setReadTimeout(60, TimeUnit.SECONDS);
    httpClient.setConnectTimeout(60, TimeUnit.SECONDS);
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    httpClient.interceptors().add(interceptor);

    return new Retrofit.Builder()
            .baseUrl(ENDPOINT)
            .client(httpClient)
            .addConverterFactory(GsonConverterFactory.create());
}

public Call<List<CategoryModel>> getAllCategory() {
    return service.getAllCategory();
}

然后把你所有的服务放在IService中(在我的例子中是IPlusService

    public interface IPlusService {
    //@Headers( "Content-Type: application/json" ) in Post method may use this
    @GET("/api/category")
    Call<List<CategoryModel>> getAllCategory();
}

然后在你的活动/片段中给你的单身汉打电话,如下所示:

ServiceHelper.getInstance().getAllCategory().enqueue(new Callback<List<CategoryModel>>() {
        @Override
        public void onResponse(Response<List<CategoryModel>> response, Retrofit retrofit) {
            processResponse(response);
        }

        @Override
        public void onFailure(Throwable t) {
            processResponse(null);
        }
    });
 类似资料:
  • 问题内容: 我正在使用Retrofit与我的REST API进行交互,并且想知道是否有人有任何设计建议。 我的应用程序具有以下软件包: 楷模 服务 活动 碎片 该 服务 包中包含用于改造的接口。例如: 模型包含…那么,不同的模型。例如, FooBar 。到目前为止一切顺利-正如翻新文档所述。 我创建了一个API类,该类处理Retrofit构建逻辑(等)并公开一个静态字段:Retrofit。然后在我

  • 模板安装、修改: 该文档正在编写中...

  • 装饰(Decorator) Intent 为对象动态添加功能。 Class Diagram 装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是

  • 介绍 装饰者提供比继承更有弹性的替代方案。 装饰者用用于包装同接口的对象,不仅允许你向方法添加行为,而且还可以将方法设置成原始对象调用(例如装饰者的构造函数)。 装饰者用于通过重载方法的形式添加新功能,该模式可以在被装饰者前面或者后面加上自己的行为以达到特定的目的。 正文 那么装饰者模式有什么好处呢?前面说了,装饰者是一种实现继承的替代方案。当脚本运行时,在子类中增加行为会影响原有类所有的实例,而

  • 本文向大家介绍javascript设计模式之装饰者模式,包括了javascript设计模式之装饰者模式的使用技巧和注意事项,需要的朋友参考一下 在js函数开发中,想要为现有函数添加与现有功能无关的新功能时,按普通思路肯定是在现有函数中添加新功能的代码。这并不能说错,但因为函数中的这两块代码其实并无关联,后期维护成本会明显增大,也会造成函数臃肿。 比较好的办法就是采用装饰器模式。在保持现有函数及其内

  • 问题内容: 我目前从事WPF的大量开发工作,并已开始创建一些基本的Android应用程序。在创建WPF应用程序时,我经常使用MVVM,通常使用Prism,并且想知道是否有针对Android平台的MVVM的示例? 问题答案: 我是Android- Binding 的开发人员。就像@Brentley所说的,这是一个非常新的项目,但我确实希望获得更多的嗡嗡声和经验,以便对其进行改进。回到您的问题,我编写