Android模型分层设计,同步或异步



当我设计模型层时,有两种方法来设计我的界面。同步或异步

。异步化设计:

interface Callback<T> {
    void success(T t);
    void failure(Throwable err);
}
interface UserAPI {
    void getProfile(Callback<User> callback);
}

B。同步设计> 们都有一些好处。A是非阻塞的,UI层可以直接使用它。B是阻塞的,但是很容易测试,设计很简单,但是UI层应该创建一个线程来处理它。

我真的很关心敏捷开发,易于维护,保持整个项目整洁。我应该使用哪种设计?

最终,这更多的是关于您希望您的API完成什么,它使用起来有多容易,性能影响等问题。异步设计,如果做得正确,可以帮助解决一些性能和API使用限制。但是,它们也往往难以正确实现,甚至难以被最终用户理解。同步api往往更容易理解,但有更多的限制(正如您在UI线程上使用时所注意到的那样)。就支持实现而言,异步也可能更难以理解和维护。我认为敏捷开发模型并没有真正影响到这一点,也没有影响到项目维护。我会努力确保那些从事它的人(员工、开源贡献者等)是优秀的开发人员,他们理解这两种方法,编写易于理解和结构良好的代码,并理解API的目标。

我的建议:实现一个同时提供异步和同步版本的API。最大的灵活性,两全其美。只是要确保记录这两组api,以便用户知道使用这两组api的语义。

我认为这取决于特定的任务。对于整个项目,您不能选择任何一种方式,因为它通常由多个部分组成。一般来说,为了简单起见,应该尽可能将每个任务简化为同步行为。

  1. 如果操作在固定的时间内完成,并且时间不长类中同步调用它比其他操作要长UI线程。

  2. 如果某项操作的执行时间可能很长或无限长的时间,或者取决于一些外部条件(如网络)连接,系统负载)并且不与UI层交互,那么我会在后台线程中使用同步设计。

  3. 如果与前一段相同的操作导致GUI更新,那么显然应该实现异步设计

内部使用

我想说这取决于你将如何使用这个API接口。如果它要在内部使用,那么你想在哪里处理后台线程的问题。这完全取决于你。

发布的API

如果你的API将是发布,那么实际上它取决于开发人员的需求。有些人喜欢自己处理线程,决定它是单线程队列,多线程同时解决方案还是两者的组合。对他们来说,SYNC API是完美的。

另一方面,一些开发人员可能不关心线程,只是希望尽可能容易地获得结果。对于他们来说ASYNC是完美的。

推荐

所以看起来很可能你将不得不实现这两个。它最受开发人员的欢迎,并获得广泛的用户。例如,看看最流行的网络API Retrofit。他们可能有同样的决定,他们实现了SYNC和ASYNC。

RETROFIT SYNC示例

@GET("/user/{id}/photo")
Photo getUserPhoto(@Path("id") int id);

RETROFIT ASYNC示例

@GET("/user/{id}/photo")
void getUserPhoto(@Path("id") int id, Callback<Photo> cb);

最新更新