Android改造设计模式

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

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

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

服务包包含Retrofit的接口。 例如:

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

模型包含……嗯,不同的模型。 例如, FooBar 。 到目前为止一切都很好 – 就像Retrofit文档一样。

我创建了一个API类,它处理Retrofit构建逻辑( Retrofit retrofit = new Retrofit.Builder()等),并公开一个静态字段:retrofit。在我的活动中,我可以按如下方式执行我的请求:

 FooService service = API.retrofit.create(FooService.class); Call call = service.do(); try { retrofit2.Response response = call.execute(); // ...do stuff... } catch(IOException) {} 

随之而来的是我的问题:进一步抽象上述内容会更好吗? 所以我不需要在任何地方重复上述内容? 例如,类似于:

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

有什么想法吗? 建议?

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

首先定义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> getAllCategory() { return service.getAllCategory(); } 

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

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

然后在您的activity / fragment中调用您的单例,如下所示:

 ServiceHelper.getInstance().getAllCategory().enqueue(new Callback>() { @Override public void onResponse(Response> response, Retrofit retrofit) { processResponse(response); } @Override public void onFailure(Throwable t) { processResponse(null); } }); 

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

您可以创建自己的抽象Retrofit Callback类并从中抽象出“自定义”回调,以便您自己保存代码重复。

但一般来说,我希望看到app逻辑在我发出请求的同一个地方处理响应。

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

如果您真的需要从您的活动/片段传递响应,请使用RxJava甚至LocalBroadcast。 另请尝试阅读Retrofit书籍。