我是android编程的新手。
试图从web json(网络任务)获取一些有用的数据集并解析它。
所以我选择这个Service
来做背景工作。如何在Handler.postDelayed(runnable, interval)
线程中正确安装main
的重复任务?
请帮我解决这个问题?
答案 0 :(得分:1)
IntentService
意图在后台工作线程上运行。
但是,您似乎正在向可能在UI线程上运行的处理程序发布可运行的网络操作,因为您获得了NetworkOnMainThreadException
。
这解释了这个问题。请澄清您要完成的工作,以便我们建议更好的方法。
答案 1 :(得分:0)
例外名称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你可以找到一个很好的服务教程。
答案 2 :(得分:0)
Android编程的主要行为之一是UI线程(即与用户交互的线程)必须尽可能免费。这意味着,如果您在UI线程中声明了网络连接,则会将其折叠,并且用户将获得一个不错的ANR(Android无响应)。
对于涉及网络连接的任务,我建议使用以下方法之一:
如果您的网络任务时间有限并且在启动后的短时间内结束,我建议您使用AsyncTask
。
如果您需要未定义的网络连接或永久循环套接字等,请使用Service
,它们的确属于此目的。
答案 3 :(得分:0)
NetworkOnMainThreadException
。
此问题仅适用于定位Honeycomb
SDK或更高版本的应用。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行联网,但是非常不鼓励。
因此,请使用单独的线程进行网络操作。
有关详细信息,请访问developer android site。