You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用OkHttp3出现kotlin/jvm/internal/Intrinsics缺失错误求助

可行的Android网页抓取解决方案

方案1:用原生HttpURLConnection(无额外依赖)

适合新手,不用引入第三方库,Android原生支持,步骤简单:

  • 核心代码示例:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class WebScraper {
    public static String fetchPage(String urlString) throws Exception {
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        
        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        StringBuilder content = new StringBuilder();
        while ((line = in.readLine()) != null) {
            content.append(line);
        }
        in.close();
        conn.disconnect();
        return content.toString();
    }

    // Android中必须在子线程调用,比如用Thread、AsyncTask或Coroutine
    public static void main(String[] args) {
        try {
            String pageContent = fetchPage("https://example.com");
            System.out.println(pageContent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 注意事项:
    • 要在AndroidManifest.xml里加网络权限:
      <uses-permission android:name="android.permission.INTERNET" />
      
    • Android里网络请求不能跑在主线程,得放到子线程执行,避免ANR。

方案2:用Volley(Android官方推荐的轻量网络库)

Google推出的库,专门适配Android的网络请求场景,集成和使用都简单:

  1. 在模块级build.gradle的dependencies里加依赖:
dependencies {
    implementation 'com.android.volley:volley:1.2.1'
}
  1. 核心代码示例:
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import android.content.Context;

public class VolleyScraper {
    private RequestQueue requestQueue;

    public VolleyScraper(Context context) {
        requestQueue = Volley.newRequestQueue(context);
    }

    public void fetchPage(String url, OnPageFetchedListener listener) {
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                response -> listener.onSuccess(response),
                error -> listener.onError(error.getMessage()));
        requestQueue.add(stringRequest);
    }

    public interface OnPageFetchedListener {
        void onSuccess(String content);
        void onError(String errorMsg);
    }
}
  • 在Activity里的使用方式:
VolleyScraper scraper = new VolleyScraper(this);
scraper.fetchPage("https://example.com", new VolleyScraper.OnPageFetchedListener() {
    @Override
    public void onSuccess(String content) {
        // 在这里处理抓取到的网页内容
    }

    @Override
    public void onError(String errorMsg) {
        // 处理请求错误
    }
});
  • 优势:Volley自动处理线程切换,不用自己写子线程逻辑,还自带请求缓存、重试机制。

方案3:用Jsoup(专注HTML解析,自带网络请求)

如果需要抓取后解析HTML(比如提取标题、链接、特定元素),Jsoup是绝佳选择,自带的网络请求API也很易用:

  1. 在模块级build.gradle加依赖:
dependencies {
    implementation 'org.jsoup:jsoup:1.17.2'
}
  1. 核心代码示例:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import android.os.AsyncTask;

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

    @Override
    protected String doInBackground(String... urls) {
        try {
            // 直接连接目标URL并获取文档对象
            Document doc = Jsoup.connect(urls[0]).get();
            // 提取网页标题
            String title = doc.title();
            // 提取所有带href属性的a标签
            Elements links = doc.select("a[href]");
            
            StringBuilder result = new StringBuilder();
            result.append("网页标题:").append(title).append("\n");
            for (Element link : links) {
                result.append("链接文本:").append(link.text())
                      .append(" | 链接地址:").append(link.attr("href")).append("\n");
            }
            return result.toString();
        } catch (Exception e) {
            return "抓取出错:" + e.getMessage();
        }
    }

    @Override
    protected void onPostExecute(String result) {
        // 这里是主线程,可以更新UI或者打印结果
        System.out.println(result);
    }
}
  • 使用方式:
new JsoupScraper().execute("https://example.com");
  • 注意:Jsoup的网络请求同样不能在主线程执行,这里用AsyncTask处理线程切换,也可以用Coroutine替代。

关于你遇到的OkHttp错误补充

OkHttp 4.x版本是用Kotlin重写的,必须依赖Kotlin标准库、反射库等多个jar包,手动添加很容易漏依赖,才会出现kotlin/jvm/internal/Intrinsics找不到的错误。如果非要用OkHttp,要么换3.x版本(比如3.14.9,纯Java实现,不需要Kotlin依赖),要么用Gradle/Maven管理依赖,让工具自动下载所有关联包,别手动加jar。

内容的提问来源于stack exchange,提问作者Nicolas Romano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:15:42