2013-09-10 67 views
2

我遇到了一個問題,我試圖使用JSOUP從網頁獲取數據(在本例中爲google.com),並且在調試標題數據時返回並顯示在logcat中 - 但是我的textview永遠不會更新新獲得的數據。無法使用Android/JSOUP解析HTML數據

來源:

package com.example.test; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.IOException; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 



import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.TextView; 

public class MainActivity extends Activity { 
    private TextView textView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     textView = (TextView) findViewById(R.id.TextView01); 
    } 

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... urls) { 
      String response = ""; 
      for (String url : urls) { 
       DefaultHttpClient client = new DefaultHttpClient(); 
       HttpGet httpGet = new HttpGet(url); 
       try { 
        Document doc = Jsoup.connect("http://google.com") 
           .userAgent("Mozilla") 
           .get(); 
        // get page title 
        String title = doc.title(); 
        System.out.println("title : " + title); 

        // get all links 
        Elements links = doc.select("a[href]"); 
        for (Element link : links) { 

         // get the value from href attribute 
         System.out.println("\nlink : " + link.attr("href")); 
         System.out.println("text : " + link.text()); 

        } 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      return response; 
     } 

     @Override 
     protected void onPostExecute(String title) { 
      textView.setText(title); 
     } 
    } 

    public void onClick(View view) { 
     DownloadWebPageTask task = new DownloadWebPageTask(); 
     task.execute(new String[] { "http://www.google.com" }); 
    } 
} 

編輯:(響應超級用戶的建議 - 實施處理)

public class MainActivity extends Activity { 
    private TextView textView; 
    private Handler handler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     textView = (TextView) findViewById(R.id.TextView01); 
     handler = new Handler(); 
    } 

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... urls) { 
      String response = ""; 
      for (String url : urls) { 
       DefaultHttpClient client = new DefaultHttpClient(); 
       HttpGet httpGet = new HttpGet(url); 
       try { 
        Document doc = Jsoup.connect("http://google.com") 
           .userAgent("Mozilla") 
           .get(); 
        // get page title 
        String title = doc.title(); 
        System.out.println("title : " + title); 

        // get all links 
        Elements links = doc.select("a[href]"); 
        for (Element link : links) { 

         // get the value from href attribute 
         System.out.println("\nlink : " + link.attr("href")); 
         System.out.println("text : " + link.text()); 

        } 

       } catch (IOException e) { 
        e.printStackTrace(); 

       } 
        handler.post(new Runnable() { 
        @Override 
        public void run() {}}); 

      } 
      return response; 
     } 

     @Override 
     protected void onPostExecute(String title) { 
      textView.setText(title); 
      View.invalidate(); 
     } 
    } 

    public void onClick(View view) { 
     DownloadWebPageTask task = new DownloadWebPageTask(); 
     task.execute(new String[] { "http://www.google.com" }); 

    } 
} 

結果(從編輯如上圖所示):

Cannot make a static reference to the non-static method invalidate() from the type View MainActivity.java 
Cannot refer to a non-final variable title inside an inner class defined in a different method MainActivity.java 

回答

0

嘗試傳遞textview作爲您的類的構造函數參數DownloadWebPageTask。

DownloadWebPageTask task = new DownloadWebPageTask(textView); 

在您的DownloadWebPageTask類中定義一個TextView變量來容納此對象。

更新onPostExecute()方法中的相同內容。

2

對不起,是昨天來回答這個問題,但我的鍵盤上睡着了:P

但是你的結果字符串:protected void onPostExecute(String result)沒有得到任何東西通過。這個問題很容易解決。

  1. 以上您的onCreate:

String title;

  1. 在你doInBackGround:

title = doc.title();

  1. 在你onPostExecute:

    @Override 
    protected void onPostExecute(String result) { 
        textView.setText(title); 
    }