在 Android 开发中, 我们经常需要处理各种网络异常,例如 No Network (无网络), Bad Network (网络差), When Network Changed (网络改变) 等。以下是在 Android 中捕获网络异常的基本步骤:
检测网络情况
Android 提供了名为 ConnectivityManager 的类用以检测当前的网络状态,可以使用 getSystemService 获得它。
下面是一个用于判断当前网络是否可用的方法:
public boolean isNetworkAvailable(){
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
监听网络变更
在 AndroidManifest.xml 中添加权限和对网络变化的监听:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<!-- 在这里监听网络状态的改变 -->
<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
创建一个类 NetworkChangeReceiver 继承 BroadcastReceiver ,并重写 onReceive 方法,如下:
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.isAvailable()){
// Network is available
}else{
// Network is not available
}
}
}
这样,当网络变化时,系统将发送一个 “android.net.conn.CONNECTIVITY_CHANGE” 的广播,我们的 NetworkChangeReceiver 就能接收到这个广播,并执行相应的操作。
注:从 Android N 开始,系统对隐式广播做了限制,条件网络变化的广播未来无法静态注册,只能在代码中动态注册。意味着需要在你的应用初始化时判断网络并在网络出现后再处理流程。具体参见 Android 官方文档。
捕获网络异常
Android 定义了各种类型的网络异常,例如 SocketTimeoutException (Socket 超时), UnknownHostException (未知主机), HttpRetryException (HTTP 重试) 等。
当你执行一个网络请求时,例如访问一个 URL 或者向服务器发送数据,你需要使用 try-catch 语句块将这个操作包围起来,以便捕获可能发生的异常,如下:
try{
// 访问一个 URL 或者 发送数据给服务器
}catch(Exception e) {
if (e instanceof SocketTimeoutException) {
// Deal with SocketTimeoutException
} else if (e instanceof UnknownHostException) {
// Deal with UnknownHostException
}
}
发布者:luotuoemo,转转请注明出处:https://www.jintuiyun.com/170882.html