问题
I'm having an issue where I'm attempting to use JSOUP to obtain data from an webpage (in this case - google.com) and when debugging the title data is returned and shown in the logcat - however my textview never seems to update with the freshly obtained data.
SOURCE:
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: (in response to superuser's suggestion - implementing handler)
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" });
    }
}
RESULTS (from edit shown above):
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
回答1:
Sorry, was about to answer this question yesterday but fell asleep on my keyboard :P
But your result string: protected void onPostExecute(String result) doesn't get anything passed. The problem is easily solved.
- Above your onCreate:
String title;
- In your doInBackGround:
title = doc.title();
- In your onPostExecute: - @Override protected void onPostExecute(String result) { textView.setText(title); }
回答2:
Try passing the textview as an contructor argument to your class DownloadWebPageTask.
DownloadWebPageTask task = new DownloadWebPageTask(textView);
In your DownloadWebPageTask class define a TextView variable to hold this object.
Update the same in onPostExecute() method.
来源:https://stackoverflow.com/questions/18728984/cannot-parse-html-data-using-android-jsoup