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

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()
    }
}

必加的配置

  1. 网络权限:在AndroidManifest.xml里添加权限声明:
<uses-permission android:name="android.permission.INTERNET" />
  1. 明文网络请求(如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:00:18