【问题标题】:Android Library: Handle async http requests internally?Android 库:在内部处理异步 http 请求?
【发布时间】:2011-07-26 18:08:20
【问题描述】:
我正在编写一个 Android 库,它可以向一堆不同的服务发出 http 请求。目前,我在 AsyncTask 中发生了 http 请求,并在 onPostExecute 方法中回调应用程序提供的委托并返回结果。因此,基本上开发人员调用他们想要的方法而不用担心创建 AsyncTask。
但是,我开始怀疑是否应该异步进行这些调用,或者让库完全同步,并让开发人员负责将方法调用放在他们应用程序中的 AsyncTasks 中。有没有关于此类事情的最佳做法?
【问题讨论】:
标签:
android
android-library
【解决方案1】:
根据我参与多个具有广泛 API 的项目的经验,在大多数情况下,我们决定提供异步 API,最终,我们不得不提供额外的同步 API,或者用新的 API 淘汰旧的异步 API同步 API。
当我编写 API 时,我尽量避免对最终用户做出任何假设。
我认为您会发现以下有趣的内容(或者我希望如此):
How to Write Good API
【解决方案2】:
如果您想要严格,请将异步任务放在您的库中,这样开发人员就别无选择,只能异步执行请求(您的库中已经完成)。
但如果您想更加灵活,请让开发人员决定是否要将其置于异步状态。
如果我是你,我会将决定权留给开发人员,因为库的目的是执行请求并获得结果,而不是如何执行请求。这样,您的库将适合任何开发人员的愿望,而不是相反。
【解决方案3】:
我认为在您的库中异步进行调用是个好主意。要在收到数据时通知调用Activity,您应该在Class 中定义一个抽象方法,在请求和处理完成后在类中调用该方法。然后使用您的Class 的用户将必须实现该方法,并且在处理完成时将调用该方法。例如:
public class ProcessingClass{
private void processData(){
//Async processing
.....
onProcessComplete();
}
public abstract void onProcessComplete(){
}
}
然后假设在您的活动中,您可以执行以下操作:
private class MyProcessingClass extends ProcessingClass{
@Override
public void onProcessComplete(){
//The task is complete...
//Update UI or something like this...
}
}