5

在我的应用程序中,我有很多 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 请求之后做什么?

4

3 回答 3

4

总的来说,您应该在执行网络请求时远离 AsyncTasks。

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

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

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

于 2013-03-22T12:47:59.210 回答
1

许多异步类没有错。

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

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

于 2013-03-22T12:49:01.293 回答
0

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

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

我认为这是一种有效的方式,即使可能不是理想的方式。

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

于 2013-03-22T12:39:03.623 回答