Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed

问题描述:在连接设备热点的开发中,使用WifiNetworkSpecifier连上设备热点,再切换回原网络后,http请求一直报SocketException: Connection failed (OS Error: Machine is not on the network, errno = 64)

Android 10 中需要使用新的网络连接api WifiNetworkSpecifier

val specifier = WifiNetworkSpecifier.Builder()
  .setSsidPattern(PatternMatcher(deviceid, PatternMatcher.PATTERN_LITERAL))
  .build()

val request = NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
  //.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  //.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)//网络不受限
  //.addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)//信任网络,增加这个参数让设备连接wifi之后还联网。
  .setNetworkSpecifier(specifier)
  .build()

connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

networkCallback = object : ConnectivityManager.NetworkCallback() {
  override fun onAvailable(network: Network) {
    super.onAvailable(network)
    connectivityManager.bindProcessToNetwork(network)
    Log.i("wifi", "connect success")
  }

  override fun onUnavailable() {
    super.onUnavailable()
    Log.i("wifi", "connect faild")
  }
}
connectivityManager.registerNetworkCallback(request, networkCallback)
connectivityManager.requestNetwork(request, networkCallback) 

分析:在使用WifiNetworkSpecifier 连接时修改了网络配置,导致切换回原网络时,环境发生了改变,但没有重置网络配置,导致请求失败。

原因:使用 WifiNetworkSpecifier请求连接目标network时,在requestNetwork绑定NetworkCallback中,我们需要使用bindProcessToNetwork将当前进程绑定到连接的网络上,确保所有的请求连接绑定在目标network上,才能在目标netwoek上正常请求网络,因此在切换回原网络后,如未重置配置,当前app进程的所有http请求都将继续在目标network上继续进行,即使断开了连接。如果network断开连接,以这种方式创建的所有Socket都将停止工作,并且所有主机名解析都将失败。这是设计使然,app认为仍绑定到特定Network. 所以要清除绑定,使用null重新绑定network

fun unregisterNetWork() {
  connectivityManager.bindProcessToNetwork(null)
  connectivityManager.unregisterNetworkCallback(networkCallback)
} 

最后

分享给大家一份面试题合集。

下面的题目都是在Android交流群大家在面试时遇到的,如果大家有好的题目或者好的见解欢迎分享,楼主将长期维护此帖。
参考解析:郭霖、鸿洋、玉刚、极客时间、腾讯课堂…

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 Handler、Activity相关、Fragment、service、布局优化、AsyncTask相关
、Android 事件分发机制、 Binder、Android 高级必备 :AMS,WMS,PMS、Glide、 Android 组件化与插件化等面试题和技术栈!
Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第1张图片

Handler 相关知识,面试必问!

常问的点:
Handler Looper Message 关系是什么?
Messagequeue 的数据结构是什么?为什么要用这个数据结构?
如何在子线程中创建 Handler?
Handler post 方法原理?
Android消息机制的原理及源码解析
Android Handler 消息机制

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第2张图片

Activity 相关

启动模式以及使用场景?
onNewIntent()和onConfigurationChanged()
onSaveInstanceState()和onRestoreInstanceState()
Activity 到底是如何启动的
启动模式以及使用场景
onSaveInstanceState以及onRestoreInstanceState使用
onConfigurationChanged使用以及问题解决
Activity 启动流程解析

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第3张图片

Fragment

Fragment 生命周期和 Activity 对比
Fragment 之间如何进行通信
Fragment的startActivityForResult
Fragment重叠问题
Fragment 初探
Fragment 重叠, 如何通信
Fragment生命周期

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第4张图片

Service 相关

进程保活
Service的运行线程(生命周期方法全部在主线程)
Service启动方式以及如何停止
ServiceConnection里面的回调方法运行在哪个线程?
startService 和 bingService区别
进程保活一般套路
关于进程保活你需要知道的一切

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第5张图片

Android布局优化之ViewStub、include、merge

什么情况下使用 ViewStub、include、merge?
他们的原理是什么?
ViewStub、include、merge概念解析
Android布局优化之ViewStub、include、merge使用与源码分析

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第6张图片

BroadcastReceiver 相关

注册方式,优先级
广播类型,区别
广播的使用场景,原理
Android广播动态静态注册
常见使用以及流程解析
广播源码解析

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第7张图片

AsyncTask相关

AsyncTask是串行还是并行执行?
AsyncTask随着安卓版本的变迁
AsyncTask完全解析
串行还是并行

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第8张图片

Android 事件分发机制

onTouch和onTouchEvent区别,调用顺序
dispatchTouchEvent, onTouchEvent, onInterceptTouchEvent 方法顺序以及使用场景
滑动冲突,如何解决
事件分发机制
事件分发解析
dispatchTouchEvent, onTouchEvent, onInterceptTouchEvent方法的使用场景解析

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第9张图片

Android View 绘制流程

简述 View 绘制流程
onMeasure, onlayout, ondraw方法中需要注意的点
如何进行自定义 View
view 重绘机制

  • Android LayoutInflater原理分析,带你一步步深入了解View(一)

  • Android视图状态及重绘流程分析,带你一步步深入了解View(二)

  • Android视图状态及重绘流程分析,带你一步步深入了解View(三)

  • Android自定义View的实现方法,带你一步步深入了解View(四)

    Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第10张图片

Android Window、Activity、DecorView以及ViewRoot

Window、Activity、DecorView以及ViewRoot之间的关系

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第11张图片

Android 的核心 Binder 多进程 AIDL

常见的 IPC 机制以及使用场景
为什么安卓要用 binder 进行跨进程传输
多进程带来的问题

  • AIDL 使用浅析

  • binder 原理解析

  • binder 最底层解析

  • 多进程通信方式以及带来的问题

  • 多进程通信方式对比

    Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第12张图片

Android 高级必备 :AMS,WMS,PMS

AMS,WMS,PMS 创建过程

  • AMS,WMS,PMS全解析

  • AMS启动流程

  • WindowManagerService启动过程解析

  • PMS 启动流程解析

    Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第13张图片

Android ANR

为什么会发生 ANR?
如何定位 ANR?
如何避免 ANR?
什么是 ANR
如何避免以及分析方法
Android 性能优化之 ANR 详解

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第14张图片

Android 内存相关

注意:内存泄漏和内存溢出是 2 个概念

什么情况下会内存泄漏?
如何防止内存泄漏?

  • 内存泄漏和溢出的区别

  • OOM 概念以及安卓内存管理机制

  • 内存泄漏的可能性

  • 防止内存泄漏的方法

    Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第15张图片

Android 屏幕适配

屏幕适配相关名词解析
现在流行的屏幕适配方式

  • 屏幕适配名词以及概念解析

  • 今日头条技术适配方案

    Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第16张图片

Android 缓存机制

LruCache使用极其原理

  • Android缓存机制

  • LruCache使用极其原理述

    Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第17张图片

Android 性能优化

如何进行 内存 cpu 耗电 的定位以及优化
性能优化经常使用的方法
如何避免 UI 卡顿

  • 性能优化全解析,工具使用

  • 性能优化最佳实践

  • 知乎高赞文章

    Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第18张图片

Android MVC、MVP、MVVM

好几种我该选择哪个?优劣点

任玉刚的文章:设计模式选择

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第19张图片

Android Gradle 知识

这俩篇官方文章基础的够用了
必须贴一下官方文档:配置构建
Gradle 提示与诀窍

Gradle插件 了解就好
Gradle 自定义插件方式
全面理解Gradle - 执行时序

  • Gradle系列一

  • Gradle系列二

  • Gradle系列三

    Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第20张图片

RxJava

使用过程,特点,原理解析
RxJava 名词以及如何使用
Rxjava 观察者模式原理解析
Rxjava订阅流程,线程切换,源码分析 系列

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第21张图片

OKHTTP 和 Retrofit

OKHTTP完整解析
Retrofit使用流程,机制详解
从 HTTP 到 Retrofit
Retrofit是如何工作的

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第22张图片

最流行图片加载库: Glide

郭神系列 Glide 分析
Android图片加载框架最全解析(一),Glide的基本用法
Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程
Android图片加载框架最全解析(三),深入探究Glide的缓存机制
Android图片加载框架最全解析(四),玩转Glide的回调与监听
Android图片加载框架最全解析(五),Glide强大的图片变换功能
Android图片加载框架最全解析(六),探究Glide的自定义模块功能
Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第23张图片

Android 组件化与插件化

为什么要用组件化?
组件之间如何通信?
组件之间如何跳转?
Android 插件化和热修复知识梳理
为什么要用组件化

  • Android彻底组件化方案实践
  • Android彻底组件化demo发布
  • Android彻底组件化-代码和资源隔离
  • Android彻底组件化—UI跳转升级改造
  • Android彻底组件化—如何使用Arouter

插件化框架历史
深入理解Android插件化技术
Android 插件化和热修复知识梳理

Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed_第24张图片

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

好啦,这份资料就给大家介绍到这了,有需要详细文档的小伙伴,可以微信扫下方二维码免费领取哈~

你可能感兴趣的:(Android进阶,android,android面试,android,java,apache)