【问题标题】:How to use AsyncTask for Jsoup Parser?如何将 AsyncTask 用于 Jsoup 解析器?
【发布时间】:2011-08-16 19:12:27
【问题描述】:

我正在尝试使用 AsyncTask,因为 activty 强制关闭,因为它在主线程上需要很长时间。

这是我想在 DoInBackGround 中使用的内容..

}
class fetcher extends AsyncTask<Void,Void, Void>{

    @Override
    protected Void doInBackground(Void... arg0) { 
        Document doc = null;
        try {
            doc = Jsoup.connect(url).get();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        TextView article = (TextView)findViewById(R.id.releaseInfo);
        final TextView featuresText = (TextView)findViewById(R.id.features);

        // Get the overview div
        Element overview = doc.select("div#object-overview").last();
        Element featureList = doc.select("div.callout-box").last();

        Elements features = featureList.select("li");
        ListIterator<Element> featList = features.listIterator();
        while (featList.hasNext()) {
            featuresText.setText("Features: " + featList.next().text() + "\n");

        }


        // Get the paragraph element
        Element paragraph = overview.select("p").last();
        System.out.println(paragraph.text());

        article.setText(paragraph.text());


        return null;
    }

}

}

它总是强制关闭我不知道为什么?

编辑:这是我得到的调试错误

08-16 18:52:59.547: WARN/System.err(27209): java.net.SocketTimeoutException
08-16 18:52:59.547: WARN/System.err(27209):     at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:564)
08-16 18:52:59.547: WARN/System.err(27209):     at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:61)
08-16 18:52:59.547: WARN/System.err(27209):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.readln(HttpURLConnectionImpl.java:1279)
08-16 18:52:59.547: WARN/System.err(27209):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.readServerResponse(HttpURLConnectionImpl.java:1351)
08-16 18:52:59.547: WARN/System.err(27209):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.sendRequest(HttpURLConnectionImpl.java:1339)
08-16 18:52:59.547: WARN/System.err(27209):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequestInternal(HttpURLConnectionImpl.java:1656)
08-16 18:52:59.547: WARN/System.err(27209):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequest(HttpURLConnectionImpl.java:1649)
08-16 18:52:59.557: WARN/System.err(27209):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:1374)

更多...

08-16 18:52:59.577: ERROR/AndroidRuntime(27209): FATAL EXCEPTION: AsyncTask #2
 08-16 18:52:59.577: ERROR/AndroidRuntime(27209): java.lang.RuntimeException: An error occured while executing doInBackground()
08-16 18:52:59.577: ERROR/AndroidRuntime(27209):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209):     at java.lang.Thread.run(Thread.java:1096)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209): Caused by: java.lang.NullPointerException
08-16 18:52:59.577: ERROR/AndroidRuntime(27209):     at com.fttech.htmlParser.HtmlparserExampleActivity$getGames.doInBackground(HtmlparserExampleActivity.java:156)
08-16 18:52:59.577: ERROR/AndroidRuntime(27209):     at com.fttech.htmlParser.HtmlparserExampleActivity$getGames.doInBackground(HtmlparserExampleActivity.java:1)

在doInBackground()中的NullPointerException指向这个方法

                Elements games = doc.select("tr>  td.indexList1, tr > td.indexList2");

编辑:在 android honeycomb 上运行时出现此错误

08-16 19:04:01.600: ERROR/AndroidRuntime(7302): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

【问题讨论】:

  • logcat的错误是什么,请显示错误。

标签: android android-asynctask


【解决方案1】:

您的代码示例的另一个问题:doInBackground() 在单独的线程上运行。您正试图从后台线程操作两个 TextViews,这在 Android 中是不允许的。

来自Android SDK docs

此外,Andoid UI 工具包不是线程安全的。所以,你必须 不要从工作线程操作你的 UI——你必须做所有事情 从 UI 线程对用户界面进行操作。因此,有 只是 Android 单线程模型的两条规则:

不要阻塞UI线程

不要从 UI 线程外部访问 Android UI 工具包

您必须将对 TextView 的调用移回您的主线程。 AsyncTask 为您提供了两种内置方法:onProgressUpdate()onPostExecute()。您放入其中任何一种方法的代码都将在主 UI 线程上运行。

【讨论】:

  • 正确,但这是另一回事。首先,由于 doc null 对象而引发了 NPE,因此从 AsyncTask 中引发了运行时异常
【解决方案2】:

http://download.oracle.com/javase/1.5.0/docs/api/java/net/SocketTimeoutException.html

您的连接已超时。这就是抛出 NPE 的原因,因为您试图从一个空对象.select("something")doc Document 对象为空,因为没有从 url 返回数据。所以AsyncTask 实例正在抛出RuntimeException

检查您是否在代理后面。检查您是否可以在浏览器中访问该网址。检查模拟器的DNS。还要检查清单中的 INTERNET 权限。

另外:更新 UI 必须在 UI 线程中完成。即你需要在onPostExecute()

编辑:

class fetcher extends AsyncTask<Void,Void, Void>{
   //HERE DECLARE THE VARIABLES YOU USE FOR PARSING
   private Element overview=null;
   private  Element featureList=null;
   private Elements features=null;
   private Element paragraph =null;
    @Override
    protected Void doInBackground(Void... arg0) { 
        Document doc = null;
        try {
            doc = Jsoup.connect(url).get();
      overview = doc.select("div#object-overview").last();
       featureList = doc.select("div.callout-box").last();

       features = featureList.select("li");
       paragraph = overview.select("p").last();
        System.out.println(paragraph.text());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Get the paragraph element
       // article.setText(paragraph.text()); I comment this out because you cannot update ui from non-ui thread, since doInBackground is running on background thread.


        return null;
    }
     @Override
     protected Void onPostExecute(Void result)
     {

    TextView article = (TextView)findViewById(R.id.releaseInfo);
        final TextView featuresText = (TextView)findViewById(R.id.features);
      for(Element e: features)
      {
        //setText()
      } 

} 

}

【讨论】:

  • 我注意到如果我的调试设备有良好的服务,它就会运行!但是我没有服务或服务非常低的那一刻,就像没有酒吧一样,它给出了超时错误
  • 这可以解释为什么文档返回 null
  • 在 try catch 语句中添加代码。你可以尝试在一个while循环中循环它,比如Document doc = null; ``while(doc==null)try这个catch那个
  • 还将IOException e 更改为Exception e。或者为所有你能想到的由于解析操作而引发的异常添加多捕获语句。
  • 如果(doc == null)我可以吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-11
  • 2016-06-30
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多