我是Android开发的新手。抱歉愚蠢的问题。
我需要检查几个http资源(resource1,resource2 ......等)并检查它们是否已启动。如果资源1不可用,那么应用程序需要检查互联网是否已启动(可能ping谷歌?)然后如果连接实际正在运行,则需要检查所有其他资源并将有关内容的信息放到通知抽屉中
使用 AsyncTask 和 HttpURLConnection 为一个资源执行此操作非常简单,但我不太明白如何遵循执行逻辑异步调用(resource1 - > google - > resource2 - >在一个地方收集信息 - >显示通知)。它的最佳实践是什么?
答案 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有趣的视频。
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();