安卓最佳实践:AsyncTask

5

我是Android开发的新手,抱歉问一个愚蠢的问题。

我需要检查几个http资源(资源1、资源2等),并检查它们是否可用。如果资源1不可用,则应用程序需要检查网络是否正常(可能会ping谷歌?),然后如果连接确实工作,它需要检查所有其他资源,并将有关下线信息放置在通知抽屉中。

使用AsyncTaskHttpURLConnection对于一个资源来说很容易做到,但我不太明白如何跟随异步调用的执行逻辑(资源1 -> 谷歌 -> 资源2 -> 在一个地方收集信息 -> 显示通知)。这方面的最佳实践是什么?

4个回答

9
@FD_的答案是有效的,但我认为有一种更好的方法可以避免Async Task的困扰。为了记录,我upvoted FD_的答案,因为它是有效的,我只是指出另一种方式。
所以我会创建一个结果对象。这可以用来确定当您尝试与各种服务通信时发生了什么。你可以像这样:
public class ResponseResult {

    public String displayName; // so we know what this was all about e.g. "google request"
    public boolean success;
    public String message;
    public int httpStatusCode; //useful to help workout what went wrong e.g. 500, 302 etc.

}

您可以使用类似于Android Volley Library的东西,它比AsyncTask更好,因为它在另一个线程中使用RequestQueue,可以更好地保留Activity生命周期。它还可能使您的代码更易于阅读/管理。
您可以在此处阅读有关Volley Vs AsyncTask的一些信息-Volley and AsyncTask 一旦您处理完所有请求并将结果放入数组或列表中,您就可以迭代它们以打印结果。
您可以从此处获取Volleyhttps://android.googlesource.com/platform/frameworks/volley 其他信息 您可能还会发现Robospice的这个信息图很有用,因为它有助于解释AsyncTask的缺点。 https://raw.github.com/octo-online/robospice/master/gfx/RoboSpice-InfoGraphics.png 另一种实现方式 您可能会发现此实现不适合您,但它有一定意义,并且可以产生更少的代码。
您可以编写一些服务器端代码来为您执行检查并返回结果对象的XML / JSON数组。这具有单个请求到硬连接服务器的优点,具有更可靠的连接,可能可以在更短的时间内进行请求。
您的Android设备仅会向服务器发出单个请求,然后按照上述方法处理结果数组。
主要缺点是这将引入另一组代码和附加硬件。

听起来不错!唯一的问题是,我需要在所有请求完成时显示通知,但它们是异步的。那么如何检查是否全部完成?或者我又错过了什么? - Fyodor Dostoyevsky
你会如何使用AsyncTask来完成这个任务?它是相同的问题。你可以链接逻辑(可能会有点混乱和关注点分离不够好),或者你可以在Volley的每个响应中计算数组中对象的数量,如果结果对象与请求一样多,则表示已完成,或者当每个请求完成时,检查RequestQueue中的挂起请求是否为空。还可能有其他选项。 - Graham Smith
在AsyncTask(如FD_所建议的)中,我可能只会在doInBackground中一个接一个地执行请求。这样做没问题,因为它已经在后台线程中了,而且我的任务很简单。但我需要研究一下Volley,它似乎非常有前途。谢谢你的回复,我是Android新手,巨大的问题是它缺乏好的“最佳实践”评论和文档示例。许多东西从版本到版本都会发生变化,许多提出的开箱即用的解决方案是无法使用的,每个内置函数都有其第三方库。 :)此外,还有很多过时的信息。 - Fyodor Dostoyevsky
你可以采用我的另一个建议,编写一个简单的服务器脚本,并通过Volley调用它。然后你只需要获取一个数组返回。尤其是在使用服务器时,在3G上加载时间更快的可能性仍然很小。 - Graham Smith

3
我建议也使用Volley库来达到这个目的。请查看关于此的谷歌IO 2013有趣视频。
使用Volley的优势:
- Volley自动安排所有网络请求。这意味着Volley将负责您的应用程序执行的所有网络请求,以获取来自Web的响应或图像。 - Volley提供透明的磁盘和内存缓存。 - Volley提供强大的取消请求API。这意味着您可以取消单个请求,也可以设置要取消的请求块或范围。 - Volley提供强大的自定义能力。 - Volley提供调试和跟踪工具
图片来源:http://www.technotalkative.com/android-volley-library-example/
另一方面,如果其中一个资源不可用,您无需像您所说的那样ping google。Android API具有检查移动设备是否连接到互联网的功能;类似以下内容即可:
private boolean isConnectedToInternet() {
  return (((ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null); 
}

对于这个方法,我在其他应用程序中也有类似的东西。 - Graham Smith

1
只需在同一个AsyncTask中执行所有逻辑和互联网操作。创建一个保存所有结果信息的类,并实现AsyncTask以返回(例如发送给委托/监听器/调用主线程方法)该类的实例。

0

如果你喜欢使用类似于Jquery的$ajax语法来执行异步任务,这篇文章会向你展示如何实现。在这篇文章中,只需很少的代码和Java 8的lambda表达式,你就能像这样编写异步代码:

 Async.run(() -> {
       //code will be executed on a background thread
       MyAPI api = new MyAPI()
       return api.loadData();
   })
   .whenComplete((data) -> {
       //back on UI thread, update UI using data returned
   })
   .onError((ex) -> {
       //handle exception on UI thread  
   })
   .execute();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接