2011-08-16 13 views
0

メインスレッドで長い時間がかかるため、アクティビティ強制が終了するため、AsyncTaskを使用しようとしています。ここでAsyncTask for Jsoup Parserの使い方は?

は私が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; 
    } 

} 

}

それは常に力は、私はなぜ知らない閉じ?

EDIT:これはデバッグエラーの私は

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"); 

EDIT :アンドロイドハニカムで実行するとこのエラーが発生する

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. 
+0

logcatのエラーは何ですか?エラーを表示してください。 –

+0

私の編集をチェックしてください – yoshi24

答えて

1

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

接続がタイムアウトしたあなた。あなたがヌルオブジェクトから.select("something")にしようとしているので、NPEがスローされます。 docDocumentオブジェクトは、URLから返されるデータがないため、nullです。したがって、AsyncTaskインスタンスはRuntimeExceptionを投げています。

プロキシを使用していないかどうかを確認してください。ブラウザのURLにアクセスできるかどうかを確認してください。エミュレータのDNSを確認してください。また、あなたのマニフェストでインターネットの許可を確認してください。

プラス:UIの更新はUIスレッドで行う必要があります。あなたのコードサンプルと

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() 
     } 

} 

} 
+0

私はデバッグデバイス上で良いサービスをしていれば、それが実行されます。しかし、私はサービスやサービスを持っていない分は、バーのように極端に低く、それはタイムアウトエラーを与えます – yoshi24

+0

それは、文書がnullを返す理由を説明するかもしれません – yoshi24

+0

try catchの中にコードを追加します。 'Document doc = null;のようなループの中でループを試すことができます。 '' while(doc == null) ''この 'catch'を' '試してください。 –

3

もう一つの問題:doInBackground()は別のスレッドで実行されるすなわち、あなたはonPostExecute()

Еditであることを行う必要があります。バックグラウンドスレッドから2つのTextViewsを操作しようとしていますが、これはAndroidでは許可されていません。 Android SDK docsから

また、Andoid UIツールキットは、スレッドセーフではありません。だから、 ワーカースレッドからUIを操作しないでください。UIスレッドからユーザーインターフェイスへの操作をすべて する必要があります。したがって、そこ は、Androidのシングルスレッドモデルには2つのルールだけである:UIスレッドをブロックしないでください

は、UIスレッドの外からAndroidのUIツールキットにはアクセスしないでください

あなたは持っていますTextViewへの呼び出しをメインスレッドに戻します。 AsyncTaskには、これを行うための2つの組み込み方法があります:onProgressUpdate()onPostExecute()。これらのメソッドのいずれかに入れたコードは、メインのUIスレッドで実行されます。

+0

正解ですが、ここに別のものがあります。まず、NPEがdoc nullオブジェクトのためにスローされるため、AsyncTaskから実行時例外がスローされます –