【问题标题】:Jsoup on Android throws NoClassDefFoundError: java.applet.AppletAndroid 上的 Jsoup 抛出 NoClassDefFoundError: java.applet.Applet
【发布时间】:2012-12-31 04:33:52
【问题描述】:

这个问题已经通过规避解决了,但如果有人想尝试找出解决方案,我将不予回答。对于任何寻求快速解决方案的人:我只需将 Jsoup 替换为 jericho 即可使其正常工作。

如标题所述,我遇到了一个非常奇怪的问题。我正在做一些 html 抓取,这在我的计算机上运行得很好,但是一旦我将它变成一个 Android apk,这个库似乎就坏了。我正在使用 Jsoup 1.7.1。这是重复错误的示例代码。

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        GetHtml updater = new GetHtml();
        updater.execute();
    }

    public class GetHtml extends AsyncTask<Void, Void, String>{

        @Override
        protected String doInBackground(Void... arg0) {
            Document doc;
            try {
                doc = Jsoup.connect("http://www.example.com").get();
                String header = doc.getElementsByTag("h1").get(0).text();
                return header;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return "";
        }

        @Override
        protected void onPostExecute(String arg0){
            ListView lv = (ListView)findViewById(R.id.listView1);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, R.id.listView1);
            lv.setAdapter(adapter);

            adapter.add(arg0);
            adapter.notifyDataSetChanged();
        }
    }
}

这会引发一堆错误,但最突出的是

01-16 19:30:47.793: E/AndroidRuntime(29082): Caused by: java.lang.NoClassDefFoundError: java.applet.Applet

这很烦人,因为我看到很多使用 Jsoup 的项目都很好,还有教程。有谁知道是什么原因造成的?

哦,为了清楚起见,我将 Jsoup-1.7.1.jar 作为外部 jar 链接并复制到 $PROJECT_ROOT/libs 中。

【问题讨论】:

  • 我在使用 Jsoup.parse(someHtmlString) 时遇到了类似的问题。我得到了 java.lang.NoClassDefFoundError: org.jsoup.parser.Parser。我尝试了 Jsoup 1.8.1 和 1.8.3,但错误仍然存​​在。令人惊讶的是,错误仅发生在 Android API 级别 19 而不是 Android API 级别 23。作为规避,我转向“jericho”

标签: android applet jsoup noclassdeffounderror


【解决方案1】:

对于 API 11 或更高版本的目标,您不能从主 UI 线程访问网络。如果你这样做,你会得到一个NetworkOnMainThreadExeption。检查您的日志中是否存在该异常,因为您正在从主 UI 线程访问网络。

您可以通过将 jsoup 获取和处理放入 AsyncTask 来修复它

【讨论】:

  • 我确实针对的是后来的 API,我没有意识到这一点,所以我很感激,但是将代码放在 AsyncTask 中并没有解决问题,我仍然遇到同样的异常。我已更新我的代码示例以使用 AsyncTask。
  • @BjornSnoen 你能发布更多的 logcat 来看看错误来自哪里吗?在 AsyncTask 更改后,您的代码对我来说运行良好,因此更深入的堆栈跟踪可能会指明要走的路。
  • 很抱歉,我会这样做,但我通过用 jericho 替换 Jsoup 解决了我的问题。我仍然对 Jsoup 为什么想要 Applet 课程感到困惑,但我没有决心今晚再花五个小时来弄清楚。不过,我感谢您的帮助。
猜你喜欢
  • 2023-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 2023-04-08
  • 2019-12-31
  • 2010-12-19
相关资源
最近更新 更多