【问题标题】:Good design patterns for coding many HTTP requests in Android在 Android 中编写许多 HTTP 请求的良好设计模式
【发布时间】:2013-03-22 12:31:43
【问题描述】:

在我的应用程序中,我有很多 GET、POST、PUT 请求。现在,我有一个单例类来保存我下载的数据,并且有许多扩展 AsyncTask 的内部类。 在我的单例类中,我也有一些这样的接口:

/**
* Handlers for notifying listeners when data is downloaded
* 
*/
public interface OnQuestionsLoadedListener {

    public void onDataLoadComplete();

    public void onDataLoadingError();       
}

这种模式有什么问题吗(许多扩展 AsyncTask 的内部类)? 对于每个 HTTP 调用(1 个用于 GET,1 个用于 POST,......),它是否可以更有效地完成?如果是这样,如何决定之后要做什么,例如GET 请求?

【问题讨论】:

    标签: java android http design-patterns


    【解决方案1】:

    总体而言,您应该在执行网络请求时远离 AsyncTasks。

    您的 AsyncTask 与您的 Activity 相关联。这意味着,如果您的 Activity 停止,您的 AsyncTask 也会停止。 在获取要在该活动中显示的数据时,这不是最大的问题,因为您不会关心获取是否已停止。但是,当您想将一些保存的数据发送到服务器,并且您的用户在发送所有内容之前按下“返回”或类似的操作,数据可能会丢失并且无法发送。

    相反,您想要的是一项服务,无论您的活动发生什么,它都会继续运行。

    我建议您查看RoboSpice。即使您决定不使用它,阅读它的作用和原因也会让您很好地了解不使用 AsyncTasks 进行网络请求的一长串原因以及为什么更好地使用服务。 如果您使用它,那么关于有效网络请求的其余问题也已过时,因为他们会以最好的方式为您处理。

    【讨论】:

    • 感谢您的链接!我从未尝试过 RoboSpice,甚至从未听说过它,但在阅读了它之后,我认为它很棒。所以现在我要尽快尝试。
    • 祝你好运 :) 如果你的应用程序已经很远了,而且 RoboSpice 不容易实现,你基本上也可以构建自己的服务来处理你发送给它的意图。你可能会错过一些优化,当然还有缓存,但仍然避开了 AsyncTasks 和 Loaders 的核心问题。祝你好运
    • 所以如果我在执行异步任务期间旋转屏幕,它会重新启动吗?
    • 当您旋转屏幕时,您的 Activity 会再次调用 onDestroy() 和 onCreate()。这就是为什么您有一些方法可以首先快速保存屏幕旋转数据并在 onCreate() 中再次使用此 Bundle 数据。您的 AsyncTask 绑定到 Activity 并且会在 Activity 被销毁时立即停止存在(从而停止它正在做的任何事情)。 AsyncTask 是否重新启动,取决于您如何在 Activity 中再次启动它。如果您在 onCreate/Start 等中启动它,它将重新启动。如果它在某个按钮后面,则在您再次按下该按钮之前它不会出现。
    【解决方案2】:

    许多异步类都没有错。

    ido 有一个网络层,一个服务类。向服务类发送一个意图,并将结果接收器对象作为意图的一部分。然后在服务中在异步任务中发出 http 请求,并通过结果接收器对象发回结果。

    一个好的设计是将 ui(活动或片段)从网络访问中抽象出来。

    【讨论】:

      【解决方案3】:

      在最近开发的一个应用程序中,我遵循了类似的方案,但另外实现了一个 WebRequest 类来执行实际的 GET、POST、PUT 等操作。

      我现在拥有的是一个“连接器”类,其中包含很多 AsyncTask 子类。 然而,在我的实现中,我让它们接受一个回调对象,每个子类都将 Http 结果传递给该对象。

      我认为这是一种有效的方法,但可能并不理想。

      如果我只有一个 Asynctask 的子类,我想可能会有所改进,我会将请求正文(现在构建在这些不同的任务中)、请求 url 和方法以及回调(在我看来,这是获得结果的一种相当不错的方法。

      【讨论】:

        猜你喜欢
        • 2017-12-04
        • 2018-12-15
        • 2012-06-04
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多