1

HTMLクリーナーを使用してWebサイトからの情報を解析し、Xpathを使用して探しているデータを見つけようとしています。別のAsyncTaskクラスにhtmlcleanerのものがあり、アプリは私の電話で動作するようです。ただし、ボタンを押しても何も起こりません。これが私のメインアクティビティクラスとAsyncTaskクラスです。

package ru.habrahabr.stackparser;

import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.htmlcleaner.TagNode;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;

public class stackParser extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button button = (Button) findViewById(R.id.parse);
    button.setOnClickListener(myListener);
}

private OnClickListener myListener = new OnClickListener() {
    public void onClick(View v) {

        new parseSite().execute("http://xjaphx.wordpress.com/");
    }
};

private class parseSite extends AsyncTask<String, Void, String> {

    protected String doInBackground(String... arg) {
        String output = new String();
        try {
            htmlHelper hh = new htmlHelper();
        } finally {
        }

        return output;
    }

    protected void onPostExecute(String output) {
        TextView view = (TextView) findViewById(R.id.tv1);
        view.setText((CharSequence) output);
    }
}
}

そして、これが私の参照クラスです。誰かがこれを見て、何が起きているのか教えてくれたら本当にありがたいです。実用的な例に従って、独自のUrlとXpathを挿入しようとしましたが、機能しません。

package ru.habrahabr.stackparser;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XPatherException;

public class htmlHelper {
TagNode rootNode;
String stats;

static final String XPATH_STATS = "//div[@id='blog-stats']/ul/li";


public String htmlHelper(URL htmlPage) throws IOException, XPatherException {
    HtmlCleaner cleaner = new HtmlCleaner();
    rootNode = cleaner.clean(htmlPage);

    // query XPath
    Object[] statsNode = rootNode.evaluateXPath(XPATH_STATS);
    // process data if found any node
    if (statsNode.length > 0) {
        TagNode resultNode = (TagNode) statsNode[0];
        stats = resultNode.getText().toString();
    }
    return stats;
}
}
4

2 に答える 2

2

AsyncTaskdoInBackground メソッドを次のように変更します。

@Override
protected String doInBackground(String... arg) {
        String output "";
        try {
            htmlHelper hh = new htmlHelper();
            output=hh.htmlHelper(arg[0]);  //<< call htmlHelper method here
        } finally {
        }

        return output;
    }

現在、クラスのインスタンスを作成しているだけで、クラスからメソッドを htmlHelper呼び出して Web URL からデータを取得していないためです。htmlHelperhtmlHelper

于 2013-01-10T18:26:52.787 に答える
1

ほら、データがダウンロードされたかどうかは気にしませんが、データは既にダウンロードされており、変数outputに加えて、このコードを onPostExecute 内に配置するだけでよいと仮定します

 runOnUiThread(new Runnable() {

 public void run() {

// update data into TextView.

  TextView view = (TextView) findViewById(R.id.tv1);

view.setText((CharSequence) output);

                    }
                });

場合によっては、データが既にダウンロードされていても、UIthread を使用して Textview または任意のビューに割り当てる必要があるためです。これがうまくいくことを願っています

于 2013-01-10T18:30:33.613 に答える