线程getter方法的最佳实践

时间:2013-08-27 21:08:01

标签: android android-asynctask getter

我在应用程序中也遇到了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???
}

针对此问题的任何想法/最佳做法?

3 个答案:

答案 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中使用网络操作来避免手机冻结。这对于使您的应用响应非常重要。

更多信息:

NetworkOnMainThreadException

Responsiveness