【问题标题】:Jsoup doesn't work in android in the async taskJsoup 在异步任务中的 android 中不起作用
【发布时间】:2014-01-27 09:26:57
【问题描述】:

我正在尝试获取网页的 html 并使用 android 中的 jsoup 查找此页面中存在的所有链接。我已将 jsoup 添加为外部库。甚至尝试将其添加到 libs 文件夹中。但我收到“不幸的是应用程序停止”错误。谁能帮帮我..

这是我的 MainActivity java 代码。

package com.example.asyncjsoup;


import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;


public class MainActivity extends Activity {
private TextView textv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
        textv=(TextView)findViewById(R.id.textView1);

    new DownloadTask(textv).execute("http://www.karnatakatourism.org/");

    //Elements links=(Elements)link;
    //tv1.setText((CharSequence) b);

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

}

这是我定义异步任务的类。

package com.example.asyncjsoup;

import java.io.IOException;

import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.widget.TextView;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

@SuppressLint("NewApi")
public class DownloadTask extends AsyncTask<String, Void, Elements>{


private TextView view;

public DownloadTask(TextView textvi)
{
    this.view=textvi;
}

 @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //pDialog = new ProgressDialog(MainActivity.this);
       // pDialog.setMessage("Loading...");
       // pDialog.setIndeterminate(false);
       // pDialog.setCancelable(false);
       // pDialog.show();
    }



    @SuppressLint("NewApi")
    protected Elements doInBackground(String... urls) {

        String url = urls[0];
         Document doc;
         Elements links=null;

        try {
            //view.setText("this will be displayed in textview ");

            doc = Jsoup.connect(url).get();
            //view.setText("this wont be displayed in textview..i get unfortunately app stopped");
            links = doc.select("a[href]");


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return links;  
    }

    protected void onPostExecute(Elements result) {
        print("\nLinks: (%d)", result.size());

        for (Element link : result) {
            view.setText((CharSequence) link);
            print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
        }

    }
    private static void print(String msg, Object... args) {
        System.out.println(String.format(msg, args));
    }

    private static String trim(String s, int width) {
        if (s.length() > width)
            return s.substring(0, width-1) + ".";
        else
            return s;
    }
}

我已将互联网权限添加到我的清单文件中。

这是我的日志..

01-27 09:35:12.303: E/Trace(1293): error opening trace file: No such file or directory (2)
01-27 09:35:12.303: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:12.303: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:12.303: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:12.723: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:12.763: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.533: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.533: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.543: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.573: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.704: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.713: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.723: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.863: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.863: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.875: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.875: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.875: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.875: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:13.913: D/gralloc_goldfish(1293): Emulator without GPU emulation detected.
01-27 09:35:13.993: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:14.053: W/Trace(1293): Unexpected value from nativeGetEnabledTags: 0
01-27 09:35:15.704: D/dalvikvm(1293): GC_CONCURRENT freed 113K, 9% free 2653K/2888K, paused 78ms+4ms, total 143ms
01-27 09:35:15.704: D/dalvikvm(1293): WAIT_FOR_CONCURRENT_GC blocked 55ms
01-27 09:35:18.573: D/dalvikvm(1293): GC_FOR_ALLOC freed 333K, 19% free 2617K/3192K, paused 35ms, total 35ms
01-27 09:35:18.623: D/dalvikvm(1293): GC_FOR_ALLOC freed 118K, 17% free 2676K/3192K, paused 47ms, total 47ms
01-27 09:35:19.423: D/dalvikvm(1293): GC_CONCURRENT freed 268K, 13% free 2806K/3192K, paused 82ms+81ms, total 225ms
01-27 09:35:19.943: D/dalvikvm(1293): GC_CONCURRENT freed 99K, 7% free 3115K/3336K, paused 72ms+73ms, total 203ms
01-27 09:35:20.713: D/dalvikvm(1293): GC_CONCURRENT freed 287K, 12% free 3213K/3616K, paused 72ms+83ms, total 224ms
01-27 09:35:21.493: D/dalvikvm(1293): GC_CONCURRENT freed 224K, 10% free 3385K/3728K, paused 73ms+84ms, total 226ms
01-27 09:35:22.383: D/dalvikvm(1293): GC_CONCURRENT freed 247K, 10% free 3528K/3888K, paused 77ms+76ms, total 245ms
01-27 09:35:23.244: D/dalvikvm(1293): GC_CONCURRENT freed 249K, 10% free 3674K/4040K, paused 84ms+95ms, total 281ms
01-27 09:35:23.613: I/System.out(1293): Links: (152)
01-27 09:35:23.613: D/AndroidRuntime(1293): Shutting down VM
01-27 09:35:23.623: W/dalvikvm(1293): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
01-27 09:35:23.644: E/AndroidRuntime(1293): FATAL EXCEPTION: main
01-27 09:35:23.644: E/AndroidRuntime(1293): java.lang.ClassCastException: org.jsoup.nodes.Element cannot be cast to java.lang.CharSequence
01-27 09:35:23.644: E/AndroidRuntime(1293):     at com.example.asyncjsoup.DownloadTask.onPostExecute(DownloadTask.java:63)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at com.example.asyncjsoup.DownloadTask.onPostExecute(DownloadTask.java:1)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at android.os.AsyncTask.finish(AsyncTask.java:631)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at android.os.Looper.loop(Looper.java:137)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at android.app.ActivityThread.main(ActivityThread.java:5039)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at java.lang.reflect.Method.invokeNative(Native Method)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at java.lang.reflect.Method.invoke(Method.java:511)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-27 09:35:23.644: E/AndroidRuntime(1293):     at dalvik.system.NativeStart.main(Native Method)
01-27 09:35:28.113: I/Process(1293): Sending signal. PID: 1293 SIG: 9
01-27 10:02:31.024: E/Trace(1490): error opening trace file: No such file or directory (2)
01-27 10:02:31.024: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:31.024: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:31.024: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:31.546: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:31.583: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.335: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.335: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.353: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.374: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.553: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.563: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.573: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.768: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.774: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.804: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.804: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.813: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.813: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:32.833: D/gralloc_goldfish(1490): Emulator without GPU emulation detected.
01-27 10:02:32.943: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:33.073: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:34.673: D/dalvikvm(1490): GC_CONCURRENT freed 90K, 8% free 2782K/2996K, paused 85ms+6ms, total 151ms
01-27 10:02:37.123: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:37.123: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:37.283: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:37.283: W/Trace(1490): Unexpected value from nativeGetEnabledTags: 0
01-27 10:02:37.703: D/dalvikvm(1490): GC_FOR_ALLOC freed 451K, 21% free 2677K/3348K, paused 38ms, total 38ms
01-27 10:02:38.513: D/dalvikvm(1490): GC_CONCURRENT freed 267K, 17% free 2800K/3348K, paused 76ms+76ms, total 210ms
01-27 10:02:39.064: D/dalvikvm(1490): GC_CONCURRENT freed 100K, 8% free 3093K/3348K, paused 76ms+84ms, total 220ms
01-27 10:02:39.773: D/dalvikvm(1490): GC_CONCURRENT freed 278K, 11% free 3207K/3600K, paused 76ms+78ms, total 227ms
01-27 10:02:40.573: D/dalvikvm(1490): GC_CONCURRENT freed 223K, 10% free 3378K/3716K, paused 78ms+89ms, total 236ms
01-27 10:02:41.393: D/dalvikvm(1490): GC_CONCURRENT freed 246K, 10% free 3522K/3884K, paused 82ms+90ms, total 258ms
01-27 10:02:42.083: D/dalvikvm(1490): GC_CONCURRENT freed 253K, 10% free 3665K/4036K, paused 76ms+80ms, total 247ms
01-27 10:02:42.443: I/System.out(1490): Links: (152)
01-27 10:02:42.443: D/AndroidRuntime(1490): Shutting down VM
01-27 10:02:42.443: W/dalvikvm(1490): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
01-27 10:02:42.475: E/AndroidRuntime(1490): FATAL EXCEPTION: main
01-27 10:02:42.475: E/AndroidRuntime(1490): java.lang.ClassCastException: org.jsoup.nodes.Element cannot be cast to java.lang.CharSequence
01-27 10:02:42.475: E/AndroidRuntime(1490):     at com.example.asyncjsoup.DownloadTask.onPostExecute(DownloadTask.java:63)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at com.example.asyncjsoup.DownloadTask.onPostExecute(DownloadTask.java:1)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at android.os.AsyncTask.finish(AsyncTask.java:631)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at android.os.Looper.loop(Looper.java:137)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at android.app.ActivityThread.main(ActivityThread.java:5039)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at java.lang.reflect.Method.invokeNative(Native Method)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at java.lang.reflect.Method.invoke(Method.java:511)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-27 10:02:42.475: E/AndroidRuntime(1490):     at dalvik.system.NativeStart.main(Native Method)
01-27 10:02:45.373: I/Process(1490): Sending signal. PID: 1490 SIG: 9

【问题讨论】:

  • 你能发布 stacktrace/logcat 的输出吗?
  • 你在AndroidManifest.xml中添加了android.permission.INTERNET吗?
  • @RomanBlack 我已授予互联网权限
  • 您的日志输出中的这些行告诉实际错误 01-27 10:02:42.475: E/AndroidRuntime(1490): java.lang.ClassCastException: org.jsoup.nodes.Element cannot be cast到 java.lang.CharSequence 01-27 10:02:42.475: E/AndroidRuntime(1490): at com.example.asyncjsoup.DownloadTask.onPostExecute(DownloadTask.java:63) 01-27 10:02:42.475: E/ AndroidRuntime(1490):在 com.example.asyncjsoup.DownloadTask.onPostExecute(DownloadTask.java:1)
  • @Umar Qureshi:你能提出任何解决方案吗?

标签: android jsoup


【解决方案1】:
01-27 09:35:23.64`enter code here`4: E/AndroidRuntime(1293): java.lang.ClassCastException: org.jsoup.nodes.Element cannot be cast to java.lang.CharSequence

这告诉你不能直接将Element(jsoup.nodes)转换为CharSequnecne。 但是您可以将您的Element 转换为string,它可以直接用作CharSequence 而无需任何转换;

所以把你的 onPostExecute 改成这样的

protected void onPostExecute(Elements result) 
{
    print("\nLinks: (%d)", result.size());

    for (Element link : result) 
    {
        //view.setText((CharSequence) link);
        view.setText(link.toString());
        print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
    }
}

【讨论】:

  • @user3230637 请将我的或 Umar Quereshi 的答案标记为解决方案
【解决方案2】:

将 jsoup.jar 放入您的“libs”目录中。清理项目并重试。有时在引用项目之外的库时会出现问题。

也不要将这一行放在 doInBackground 中。您只能在 onPostExecute 中更改此文本字段。

//view.setText("this wont be displayed in textview..i get unfortunately app stopped");

【讨论】:

    【解决方案3】:

    从日志的以下部分可以清楚地看出您为什么会遇到此错误

    01-27 10:02:42.475: E/AndroidRuntime(1490): java.lang.ClassCastException:       org.jsoup.nodes.Element cannot be cast to java.lang.CharSequence
    01-27 10:02:42.475: E/AndroidRuntime(1490):     at com.example.asyncjsoup.DownloadTask.onPostExecute(DownloadTask.java:63)
    01-27 10:02:42.475: E/AndroidRuntime(1490):     at com.example.asyncjsoup.DownloadTask.onPostExecute(DownloadTask.java:1)
    

    添加 Jsoup 库不是问题,因为您在代码中使用了该库中的类,并且 eclipse 没有提到错误,所以如果是库链接错误,那么 eclipse 会警告您...

    您的日志输出清楚地表明您正面临 ClassCastException。从这个异常的名称可以清楚地看出,您正试图将一个类的对象转换为另一个不兼容的类的引用。它还给出了导致此错误的强制转换情况

    org.jsoup.nodes.Element cannot be cast to java.lang.CharSequence
    

    这意味着您正在尝试将 Element(org.jsoup.nodes.Element) 类型的对象转换为彼此不兼容的 CharSequence(java.lang.CharSequence) 类型的引用。从这里兼容我的意思是这里没有允许转换的父子关系或接口实现。

    以及关于下一行错误的更多详细信息

    01-27 10:02:42.475: E/AndroidRuntime(1490):     at com.example.asyncjsoup.DownloadTask.onPostExecute(DownloadTask.java:63)
    

    这一行清楚地表明,在第 63 行的文件“DownloadTask.java”中,您将面临这个 ClassCastException。从上面发布的 DownloadTask.java 代码中,您可以清楚地看到第 63 行如下(我只是在您的代码中添加了数字,只是为了解释)

     62  for (Element link : result) {
     63       view.setText((CharSequence) link);
     64       print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
     65   }
    

    从这里你可以很容易地看到你正在尝试将名为链接(类元素)的对象转换为不兼容的 CharSequence 的引用。如果你想显示该节点的文本,那么你必须找到 Class Element 的正确方法并记住这里这个 Element 类不是 DOM 包我的事情你在这里误解它是 org.jsoup.nodes.Element (如你所见从类 DownloadTask 顶部的 import 语句)。因此,要显示文本,您必须阅读文档以找到可以在该节点返回正确文本字符串的正确方法。

    这里是 org.jsoup.nodes.Element http://jsoup.org/apidocs/org/jsoup/nodes/Element.html 类文档的链接,从快速视图我可以说 Element 类的 data() 或 ownText() 方法正在返回您想要的字符串。因此,如果您将第 63 行的代码修改为以下代码,那么您可以获得所需的内容而不会出错

     view.setText(link.data()); 
    

    view.setText(link.ownText());
    

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多