2013-09-10 2 views
2

У меня возникла проблема, когда я пытаюсь использовать JSOUP для получения данных с веб-страницы (в данном случае - google.com) и при отладке данных заголовка возвращается и отображается в logcat - однако мое текстовое представление никогда не обновляется свежими полученными данными.Не удается проанализировать данные HTML с помощью Android/JSOUP

ИСТОЧНИК:

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

EDIT: (в ответ на предложение суперпользователя - реализации обработчика)

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

Try прохождения textview как аргумент contructor для вашего класса 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); 
    } 
    
Смежные вопросы