我开发了一款Android应用程序,它将在几天后上线。
在ICS上测试应用时,我遇到了一个不同的问题。
它在Pre-GingerBread和GingerBread版本设备上运行良好。在测试ICS设备时它会抛出NetworkOnMainThreadException
,并设法通过在AsyncTask
中放置HTTP调用来删除它。
但我的问题是我正在制作4到5个不同的HTTP Url calls
并且调用每个url需要AsyncTask,因为这些URL应该一个接一个地并发执行。
如果一个网址的结果失败,则下一个网址不应该被调用,并且应该在UI上更新。所以我为每个网址调用AsyncTask
。
我们可以在单个片段中有很多AsyncTasks
吗?从我管理到我的片段类中最多3 AsyncTask
。
如果是这样,我们可以从第一个AsyncTask
AsyncTask
方法开始执行另一个PostExecute
。
先谢谢。
答案 0 :(得分:2)
您可以将所有HTTP呼叫放在一个ASyncTask
中,然后使用publishProgress回调进行报告。当一个失败时,你可以停止那个ASyncTask而不会调用其他的。
答案 1 :(得分:1)
应该可以在一个asyncTask中一个接一个地检查URL并通过以下方式发布回来:
http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate%28Progress...%29
答案 2 :(得分:1)
NetworkOnMainThreadException
通常表示代码不佳,并且会导致糟糕的用户体验,因为只要应用程序运行某种网络活动,应用程序就会锁定。是的,(不幸的是)它适用于蜂窝前装置,但它不是任何人都应该使用的。
要解决您的问题,我强烈建议您使用单个AsyncTask并在doInBackground()
方法中连续执行所有HTTP调用。对于每个呼叫,检查呼叫是否成功。如果确实如此,那么它只会转到下一个 - 如果失败,你可以return null
之后不再进行HTTP调用,而onPostExecute()
方法将是自动调用。很简单。
以下是我想到的一个例子:
private class DoNetworkStuff extends AsyncTask<String, Integer, String> {
protected String doInBackground(String... params) {
// Do network call
if (!call.hasSucceeded()) return null;
// Do next network call
if (!call.hasSucceeded()) return null; // Check if call succeeded - pseudo code
// Continue this pattern with all your network calls
return ""; // If this point is reached, all network calls succeeded
}
protected void onPostExecute(String result) {
if (result != null) {
// All calls succeeded - celebrate!
} else {
// A call failed - clean-up...
}
}
}
在执行任何其他操作之前,请查看AsyncTask的文档并了解它。我确信这适用于您的应用:http://developer.android.com/reference/android/os/AsyncTask.html