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的网络请求场景,集成和使用都简单:
- 在模块级
build.gradle的dependencies里加依赖:
dependencies { implementation 'com.android.volley:volley:1.2.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也很易用:
- 在模块级
build.gradle加依赖:
dependencies { implementation 'org.jsoup:jsoup:1.17.2' }
- 核心代码示例:
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
相关产品推荐
相关产品推荐

