在我的应用程序中,我有很多GET,POST,PUT请求。现在,我有一个单例类,它保存我下载的数据,并有许多扩展AsyncTask的内部类。 在我的单例类中,我还有一些这样的接口:
/**
* Handlers for notifying listeners when data is downloaded
*
*/
public interface OnQuestionsLoadedListener {
public void onDataLoadComplete();
public void onDataLoadingError();
}
此模式是否有问题(许多内部类扩展了AsyncTask)? 对于每个HTTP调用可能只有1个内部类(1个用于GET,1个用于POST,......)可以更有效地完成吗?如果是这样,如何决定在例如做什么之后做什么GET请求?
答案 0 :(得分:4)
作为一个整体,您应该在执行网络请求时远离AsyncTasks。
您的AsyncTasks已链接到您的活动。这意味着,如果您的Activity停止,您的AsyncTask将停止。 在获取要在该Activity中显示的数据时,这不是最大的问题,因为您不会关心提取是否已停止。但是当您想要将一些保存的数据发送到服务器,并且您的用户在发送所有内容之前按下“返回”或类似内容时,数据可能会丢失而不会发送。
您希望拥有的服务是一项服务,无论您的活动发生什么,它都会继续运行。
我建议你看看RoboSpice。即使您决定不使用它,阅读它的作用及其原理,也可以让您深入了解不使用AsyncTasks进行网络请求的原因,以及为什么更好地使用服务。 如果你使用这个,那么关于有效网络请求的其他问题也已经过时了,因为他们会尽可能地为你处理它。
答案 1 :(得分:1)
许多异步类都没有错。
什么ido有一个网络层,一个服务类。使用resultreceiver对象作为intent的一部分向服务类发送intent。然后在服务中在异步任务中发出http请求,并通过结果接收者对象发回结果。
一个好的设计是从网络访问中抽象出ui(活动或片段)。
答案 2 :(得分:0)
在最近开发的应用程序中,我遵循了类似的方案,但另外实现了一个WebRequest类,用于实际的GET,POST,PUT等。
我现在拥有的是一个“连接器”类,其中包含大量的AsyncTask子类。 但是,在我的实现中,我让它们接受一个Callback对象,每个子类都传递Http结果。
我认为这可能是一种有效的方法。
我想象的可能是一个改进,如果我只有一个Asynctask的子类,我将传递请求体(现在是在那些不同的任务中构建),请求url和方法以及回调(在我看来,这是获得结果的一种相当不错的方式。)