2014-01-24 55 views
0

我是android编程新手。 试图从网络json(网络任务)获取一些有用的数据集并解析它。 所以我选择这个Service,做背景工作。我如何正确安装重复任务Handler.postDelayed(runnable, interval)而不是在main线程?在主线程中运行的服务中运行

请帮我解释一下吗?

+0

您不允许在主线程上执行联网操作。尝试使用单独的线程。 – Keppil

+0

你想完成什么?这段代码看起来像是你每五秒钟想在后台执行一些操作。那是对的吗?如果是这样,这项工作什么时候开始,这项工作何时会停止? – CommonsWare

+0

我尝试从网页获取一些json数据并解析它。是的,5秒足以解析json网页。至少在androidVM中已经足够了。 – Outofdate

回答

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"); 
    } 
} 

另一种选择是使用一个ServiceHere你可以找到一个很好的服务教程。

+1

AsyncTask很少是服务中的正确答案,因为AsyncTask背后的要点是允许在主应用程序线程上完成一些工作,而这在服务中几乎是不需要的。 – CommonsWare

+0

好点。我编辑了我的答案。 –

+0

谢谢你的回复。但有一种想法认为IntentService在不同的线程中运行,并且我可以在没有AsynTask的情况下进行处理。 – Outofdate

0

Android编程的一个主要行为是UI线程(即与用户交互的线程)必须尽可能地自由。这意味着如果你在UI线程中声明了一个网络连接,你将会崩溃它并且用户将得到一个很好的ANR(Android Not Responding)。

对于任务涉及的网络连接,我建议这些之一:

  • 如果您的网络任务有时间限制,并在启动后很短的时间内,它结束,我建议使用AsyncTask

  • 如果您需要一个未定义的时间网络连接或永久循环套接字等,请使用Service,它们正是为此而设计的。

0

NetworkOnMainThreadException当应用程序尝试在其主线程上执行联网操作时引发该错误。

此外,这仅适用于针对Honeycomb SDK或更高版本的应用程序。针对早期SDK版本的应用程序允许在其主要事件循环线程上进行联网,但非常不鼓励。

因此,使用单独的线程进行网络操作。

欲了解更多详情,请访问developer android site

1

IntentService意图在后台工作线程上运行。

但是,您似乎将可运行的网络操作发布到可能在UI线程上的处理程序,因为您得到NetworkOnMainThreadException

这解释了这个问题。请澄清你想要完成的事情,这样我们可以提出一个更好的方法。

+0

我更新了主要文章。 – Outofdate