Android最佳实践AsyncTask

时间:2014-02-08 21:36:18

标签: android android-asynctask

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

我需要检查几个http资源(resource1,resource2 ......等)并检查它们是否已启动。如果资源1不可用,那么应用程序需要检查互联网是否已启动(可能ping谷歌?)然后如果连接实际正在运行,则需要检查所有其他资源并将有关内容的信息放到通知抽屉中

使用 AsyncTask HttpURLConnection 一个资源执行此操作非常简单,但我不太明白如何遵循执行逻辑异步调用(resource1 - > google - > resource2 - >在一个地方收集信息 - >显示通知)。它的最佳实践是什么?

4 个答案:

答案 0 :(得分:9)

@ FD_的答案是有效的,但我认为有一种更好的方法可以避免异步任务的恐怖。为了记录,我提出了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.

}

然后你可以使用比AsyncTask更好的Android Volley Library,因为它在另一个线程中使用RequestQueue,它可以更好地在Activity生命周期中存活。它还可能使您的代码更容易阅读/管理。

你可以在这里阅读一些关于Volley Vs AsyncTask的内容 - Volley and AsyncTask

一旦您发出所有请求并将结果放入数组或列表中,您就可以迭代它们以打印结果。

你可以从这里获得Volley https://android.googlesource.com/platform/frameworks/volley

其他信息

你可能也会发现Robospice的这个inforgraphic很有用,因为它有助于解释AsyncTask的缺点。

https://raw.github.com/octo-online/robospice/master/gfx/RoboSpice-InfoGraphics.png

另一项实施

你可能会发现这种实现并不合适,但它有一定道理并且会产生更少的代码。

您可以编写一些服务器端代码来为您执行检查并返回结果对象的XML / JSON数组。这样做的好处是对具有更可靠连接的硬连线服务器提出单一请求,这可能会在更短的时间内完成请求。

您的Android设备只会向服务器发出一个请求,然后按照上面的其他方法处理结果数组。

主要缺点是这会引入另一组代码和附加硬件。

答案 1 :(得分:2)

我还鼓励使用Volley library来达到这个目的。查看Google IO 2013有趣的视频。

使用Volley的优点:

  • Volley自动安排所有网络请求。这意味着 Volley将负责处理您的应用程序的所有网络请求 执行以从网络获取响应或图像。
  • Volley提供透明的磁盘和内存缓存。
  • Volley提供强大的取消请求API。这意味着你 可以取消单个请求,也可以设置块或范围 要求取消。
  • Volley提供强大的自定义功能。
  • Volley提供调试和跟踪工具

enter image description here VIDEO: Google I/O 2013 – Volley: Easy, Fast Networking for Android

**来源*:http://www.technotalkative.com/android-volley-library-example/


另一方面,一旦其中一个资源不可用,您就不必像你所说的那样ping谷歌。 Android API可以检查您的手机是否已连接到互联网;这样的事情就足够了:

private boolean isConnectedToInternet() {
  return (((ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null); 
}

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果您希望使用与Jquery' s $ ajax类似的语法执行异步任务,this article会向您展示如何执行此操作。使用文章和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();