-1

我在我的应用程序中也遇到了 NetworkOnMainThreadException,但我不知道如何解决它。我有一个带有getter方法的类。喜欢:

public ArrayList<News> get(int i){
   // get the list of news from a HTML on the net. The news are split up into web pages   on the site
   // and i is the page number
   return NewsParser(i);
}

由于 Android 抛出异常,我想出了一个下载器类的想法,它在单独的线程中下载 HTML 内容

pubic ArrayList<News> get(int i){
   Downloader dl = new Downloader(i);
   String HTMLcontent = dl.getContent(); <-- AsyncTask starts in getContent()
   return NewsParser(HTMLcontent); <-- What happens here in the main thread???
}

这个问题的任何想法/最佳实践?

4

3 回答 3

1

仅查看您的代码和您的问题,您似乎对 AsyncTask (或一般线程)的工作原理没有非常深入的了解。

我会推荐阅读这篇文章

基本上,您的 AsyncTask 应该查询 Web URL 并下载数据。数据完成后,您的 AsyncTask 应将 HTMLContent 发送到处理程序对象。处理程序将在您的主线程上运行,因此您可以在此时向用户显示信息。

你不应该打电话

dl.getContent();

检索内容。AsyncTask 在单独的线程上运行,因此您不能只从主线程调用这样的方法。您需要创建 Downloader 对象(就像您所做的那样),然后调用

dl.execute();

启动 AsyncTask。

于 2013-08-27T21:15:48.590 回答
0

在线程中运行 get 方法,

    new Thread(new Runnable() {

        @Override
        public void run() {
            // call get method here

        }

    }).start();
于 2013-08-27T21:16:43.113 回答
0

自 Honeycomb (Android 3.0) 以来,您不能在 MainThread 中使用网络操作来避免手机冻结。这对于使您的应用具有响应性很重要。

更多信息:

NetworkOnMainThreadException

响应能力

于 2013-08-27T21:48:05.810 回答