Android中通过HttpURLConnection从API接口获取int类型数据
嘿,作为Android新手能自己搭好API还推进到开发这一步,已经超棒啦!我来帮你搞定用HttpURLConnection获取API返回的int值,然后实现你要的判断逻辑~
一步一步实现你的需求
关键前提:网络请求不能在主线程
Android系统禁止在主线程执行网络操作(会抛出NetworkOnMainThreadException),所以我们得把请求放到后台线程,拿到结果后再回到主线程处理逻辑。下面给你两种常用的实现方式:
方式1:Java环境用AsyncTask(适合入门理解)
AsyncTask能帮我们快速完成「后台请求+主线程更新」的流程,直接套下面的代码就行:
// 定义AsyncTask子类来处理网络请求 private class FetchApiIntTask extends AsyncTask<Void, Void, Integer> { @Override protected Integer doInBackground(Void... voids) { int apiResult = -1; // 默认值,标记请求失败或无效返回 HttpURLConnection urlConnection = null; BufferedReader reader = null; try { // 替换成你的API实际地址 URL apiUrl = new URL("https://your-api-domain.com/your-target-method"); urlConnection = (HttpURLConnection) apiUrl.openConnection(); urlConnection.setRequestMethod("GET"); // 根据你的API需求改POST等 urlConnection.connect(); // 读取API返回的数据流 InputStream inputStream = urlConnection.getInputStream(); if (inputStream == null) return apiResult; reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder responseBuilder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { responseBuilder.append(line); } // 将返回的字符串转为int类型 if (!responseBuilder.toString().isEmpty()) { apiResult = Integer.parseInt(responseBuilder.toString()); } } catch (IOException e) { // 捕获网络异常,比如连接失败、API不可达 e.printStackTrace(); } catch (NumberFormatException e) { // 捕获返回内容不是有效int的情况,比如API返回了字符串 e.printStackTrace(); } finally { // 一定要关闭连接和流,避免资源泄漏 if (urlConnection != null) urlConnection.disconnect(); if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return apiResult; } @Override protected void onPostExecute(Integer integer) { super.onPostExecute(integer); // 这里是主线程,可以安全处理UI或判断逻辑 int b = integer; if (b == 1) { // 写你要执行的逻辑,比如弹出提示、跳转页面等 Toast.makeText(MainActivity.this, "API返回值是1!执行对应逻辑", Toast.LENGTH_SHORT).show(); } else if (b == -1) { // 请求失败或返回无效值的处理 Toast.makeText(MainActivity.this, "请求失败或返回内容不是有效整数", Toast.LENGTH_SHORT).show(); } else { // 其他数值的处理逻辑 Toast.makeText(MainActivity.this, "API返回值是:" + b, Toast.LENGTH_SHORT).show(); } } } // 发起请求的调用(比如在按钮点击事件里) new FetchApiIntTask().execute();
方式2:Kotlin环境用Coroutines(更现代的写法)
如果用Kotlin开发,官方推荐用Coroutines处理异步任务,代码更简洁:
// 在Activity/Fragment中调用 lifecycleScope.launch { val apiResult = withContext(Dispatchers.IO) { var result = -1 var urlConnection: HttpURLConnection? = null var reader: BufferedReader? = null try { val apiUrl = URL("https://your-api-domain.com/your-target-method") urlConnection = apiUrl.openConnection() as HttpURLConnection urlConnection.requestMethod = "GET" urlConnection.connect() val inputStream = urlConnection.inputStream ?: return@withContext result reader = BufferedReader(InputStreamReader(inputStream)) val response = StringBuilder() var line: String? while (reader.readLine().also { line = it } != null) { response.append(line) } if (response.isNotEmpty()) { result = response.toString().toInt() } } catch (e: IOException) { e.printStackTrace() } catch (e: NumberFormatException) { e.printStackTrace() } finally { urlConnection?.disconnect() reader?.close() } result } // 主线程处理结果 val b = apiResult when(b) { 1 -> Toast.makeText(this@MainActivity, "返回值是1!执行对应逻辑", Toast.LENGTH_SHORT).show() -1 -> Toast.makeText(this@MainActivity, "请求失败或返回无效值", Toast.LENGTH_SHORT).show() else -> Toast.makeText(this@MainActivity, "返回值是:$b", Toast.LENGTH_SHORT).show() } }
必加的配置
- 网络权限:在
AndroidManifest.xml里添加权限声明:
<uses-permission android:name="android.permission.INTERNET" />
- 明文网络请求(如果API是http而非https):Android 9及以上默认禁止明文请求,需要在
res/xml下创建network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
然后在AndroidManifest.xml的application标签里引用:
android:networkSecurityConfig="@xml/network_security_config"
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

