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

Android无Lambda表达式检测网络连接及等价代码问询

我来帮你搞定这两个Android网络检测的问题,不用Lambda的方式其实很容易实现,咱们一步步来:

1. Android系统中不使用Lambda表达式检测网络连接的方法

检测网络连接主要有两种常用思路,都可以不用Lambda实现:

  • 通过系统服务判断网络状态:利用ConnectivityManager获取当前网络信息,判断是否有可用网络。这种方式简单但可能存在“有网络但无法访问互联网”的情况:
private boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) 
        context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager != null) {
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }
    return false;
}

注意:需要在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 通过Socket验证互联网连通性:直接尝试连接外部可靠服务器(比如谷歌的DNS服务器8.8.8.8),这种方式能更准确判断是否真的能访问互联网,通常需要结合异步任务(比如AsyncTask)避免阻塞主线程,这也是下面要讲的示例方式。
2. 对应指定实现的无Lambda表达式等价实现

你提到的那个实现原本用了Lambda表达式来传递结果回调,我们可以用匿名内部类替代Lambda,下面是完整的无Lambda版本代码:

完整AsyncTask实现类

import android.os.AsyncTask;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

class InternetCheck extends AsyncTask<Void, Void, Boolean> {
    private Consumer mConsumer;

    public interface Consumer {
        void accept(Boolean internet);
    }

    public InternetCheck(Consumer consumer) {
        mConsumer = consumer;
        execute();
    }

    @Override
    protected Boolean doInBackground(Void... voids) {
        try {
            // 连接谷歌DNS服务器,端口53是DNS服务端口,超时1500毫秒
            Socket sock = new Socket();
            sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
            sock.close();
            return true;
        } catch (IOException e) {
            return false;
        }
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        // 回调结果到外部
        if (mConsumer != null) {
            mConsumer.accept(result);
        }
    }
}

调用示例(在Activity或Fragment中)

// 创建InternetCheck实例,用匿名内部类实现Consumer接口
new InternetCheck(new InternetCheck.Consumer() {
    @Override
    public void accept(Boolean internet) {
        // 这里处理网络检测结果
        if (internet) {
            // 网络连通正常的逻辑
            Toast.makeText(MainActivity.this, "网络连接正常", Toast.LENGTH_SHORT).show();
        } else {
            // 无网络的逻辑
            Toast.makeText(MainActivity.this, "无法连接到互联网", Toast.LENGTH_SHORT).show();
        }
    }
});

注意:如果是Android 10及以上版本,直接使用Socket连接可能需要添加android.permission.INTERNET权限,记得在Manifest中声明:

<uses-permission android:name="android.permission.INTERNET" />

内容的提问来源于stack exchange,提问作者Roll'Froy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:21:31