在主线程中运行的Runnable

时间:2014-01-24 14:33:23

标签: java android runnable

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

请帮我解决这个问题?

4 个答案:

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

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

答案 2 :(得分:0)

Android编程的主要行为之一是UI线程(即与用户交互的线程)必须尽可能免费。这意味着,如果您在UI线程中声明了网络连接,则会将其折叠,并且用户将获得一个不错的ANR(Android无响应)。

对于涉及网络连接的任务,我建议使用以下方法之一:

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

  • 如果您需要未定义的网络连接或永久循环套接字等,请使用Service,它们的确属于此目的。

答案 3 :(得分:0)

当应用程序尝试在其主线程上执行网络操作时引发的

NetworkOnMainThreadException

此问题仅适用于定位Honeycomb SDK或更高版本的应用。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行联网,但是非常不鼓励。

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

有关详细信息,请访问developer android site