我在应用程序中也遇到了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???
}
针对此问题的任何想法/最佳做法?
答案 0 :(得分:1)
只要查看您的代码和您的问题,您似乎对AsyncTask(或一般的线程)的工作方式没有非常了解。
我建议阅读this article。
基本上,您的AsyncTask应查询Web URL并下载数据。数据完成后,AsyncTask应将HTMLContent发送到处理程序对象。处理程序将在主线程上运行,因此您可以在此时向用户显示信息。
你不应该打电话
dl.getContent();
检索内容。 AsyncTask在一个单独的线程上运行,因此您不能只从主线程调用这样的方法。您需要创建Downloader对象(就像您一样),然后调用
dl.execute();
启动AsyncTask。
答案 1 :(得分:0)
在线程中运行get方法,
new Thread(new Runnable() {
@Override
public void run() {
// call get method here
}
}).start();
答案 2 :(得分:0)
自Honeycomb(Android 3.0)以来,您无法在MainThread中使用网络操作来避免手机冻结。这对于使您的应用响应非常重要。
更多信息: