我是android编程新手。 试图从网络json(网络任务)获取一些有用的数据集并解析它。 所以我选择这个Service
,做背景工作。我如何正确安装重复任务Handler.postDelayed(runnable, interval)
而不是在main
线程?在主线程中运行的服务中运行
请帮我解释一下吗?
我是android编程新手。 试图从网络json(网络任务)获取一些有用的数据集并解析它。 所以我选择这个Service
,做背景工作。我如何正确安装重复任务Handler.postDelayed(runnable, interval)
而不是在main
线程?在主线程中运行的服务中运行
请帮我解释一下吗?
例外名称NetworkOnMainThreadException
说明了一切。你不应该在主线程中进行联网。这个问题有很多解决方案,AsyncTask
就是其中之一。
这里是从AndroidDevelopers一个例子:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i/(float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
另一种选择是使用一个Service
。 Here你可以找到一个很好的服务教程。
AsyncTask很少是服务中的正确答案,因为AsyncTask背后的要点是允许在主应用程序线程上完成一些工作,而这在服务中几乎是不需要的。 – CommonsWare
好点。我编辑了我的答案。 –
谢谢你的回复。但有一种想法认为IntentService在不同的线程中运行,并且我可以在没有AsynTask的情况下进行处理。 – Outofdate
Android编程的一个主要行为是UI线程(即与用户交互的线程)必须尽可能地自由。这意味着如果你在UI线程中声明了一个网络连接,你将会崩溃它并且用户将得到一个很好的ANR(Android Not Responding)。
对于任务涉及的网络连接,我建议这些之一:
如果您的网络任务有时间限制,并在启动后很短的时间内,它结束,我建议使用AsyncTask
。
如果您需要一个未定义的时间网络连接或永久循环套接字等,请使用Service
,它们正是为此而设计的。
NetworkOnMainThreadException
当应用程序尝试在其主线程上执行联网操作时引发该错误。
此外,这仅适用于针对Honeycomb
SDK或更高版本的应用程序。针对早期SDK版本的应用程序允许在其主要事件循环线程上进行联网,但非常不鼓励。
因此,使用单独的线程进行网络操作。
欲了解更多详情,请访问developer android site。
IntentService
意图在后台工作线程上运行。
但是,您似乎将可运行的网络操作发布到可能在UI线程上的处理程序,因为您得到NetworkOnMainThreadException
。
这解释了这个问题。请澄清你想要完成的事情,这样我们可以提出一个更好的方法。
我更新了主要文章。 – Outofdate
您不允许在主线程上执行联网操作。尝试使用单独的线程。 – Keppil
你想完成什么?这段代码看起来像是你每五秒钟想在后台执行一些操作。那是对的吗?如果是这样,这项工作什么时候开始,这项工作何时会停止? – CommonsWare
我尝试从网页获取一些json数据并解析它。是的,5秒足以解析json网页。至少在androidVM中已经足够了。 – Outofdate