HttpDns的作用
HTTPDNS的基本概念和作用HTTPDNS是一种使用HTTP协议进行域名解析的技术,旨在解决传统DNS解析过程中的延迟和缓存污染等问题。通过HTTP协议代替传统的DNS协议,HTTPDNS可以显著提升域名解析的速度和准确性,尤其是在高并发场景下表现更为出色
。HTTPDNS在Android中的具体应用场景和优势提升页面加载速度:在移动应用中,HTTPDNS可以显著提高页面加载速度,减少用户等待时间,提升用户体验
。高并发环境下的性能优化:在高并发环境下,传统的DNS解析可能成为瓶颈,而HTTPDNS的高性能设计能有效应对这类问题
。增强安全性:通过加密传输,HTTPDNS可以避免DNS劫持和中间人攻击,增强网络安全
。减少网络延迟:对于跨境服务,HTTPDNS可以根据用户的位置选择最优的服务器,减少网络延迟
。HTTPDNS与传统的DNS解析相比的优势延迟更低:HTTPDNS通过HTTP协议进行域名解析,通常比传统的DNS解析更快
。安全性更高:通过加密传输,避免DNS劫持和中间人攻击。高并发支持:HTTPDNS设计用于高并发环境,能够有效应 ...
OKHttp日志抓取
每次定位OkHttp问题还是比较麻烦的,所以需要添加拦截器提供更多的日志打印,从而方便定位问题。
原理:我们通过给我们App的OkHttp请求设置拦截器,拦截发出去的请求和返回的请求数据,将结果打印在log里面,方便开发过程中调试,并将结果保存在一个bean对象中,保存到文件当中(我为了方便保存在了sp中),然后写一个列表页面将自己保存的网络请求数据list显示到页面中。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 ...
OkHttp常见问题
连接超时:解释:当请求的服务器响应时间过长,超过了设置的超时时间。
解决方法:增加OkHttpClient的超时时间。
SSL握手失败:解释:安全连接建立失败,可能是证书问题。
解决方法:检查服务器证书是否有效,是否过期,以及是否被信任的证书颁发机构签发。
DNS 解析问题:解释:无法解析服务器域名对应的IP地址。
解决方法:检查网络连接,确保DNS服务正常工作,尝试使用IP地址直接访问。
Socket 断开:解释:在数据传输过程中,Socket意外关闭。
解决方法:检查网络稳定性,服务器配置,重试逻辑。
请求被重定向问题:解释:服务器返回302状态码,导致请求被重定向。
解决方法:确认重定向是否正确,可能需要处理重定向逻辑。
请求被取消:解释:请求被手动取消或者超过了设定的调用超时时间被自动取消。
解决方法:检查代码逻辑,确保不会不必要地取消请求。
请求被拦截问题:解释:请求被HTTP拦截器拦截或修改。
解决方法:检查拦截器的实现,确保它们按预期工作。
无法解析响应:解释:服务器响应的数据无法被设定的响应解析器解析。
解决方法:确保服务器响应的数据格式与解析器兼容。
无网络权限:解释 ...
OkHttp拦截器
拦截器
作用
应用拦截器
拿到的是原始请求,可以添加一些自定义header、通用参数、参数加密、网关接入等等。
RetryAndFollowUpInterceptor
处理错误重试和重定向
BridgeInterceptor
应用层和网络层的桥接拦截器,主要工作是为请求添加cookie、添加固定的header,比如Host、Content-Length、Content-Type、User-Agent等等,然后保存响应结果的cookie,如果响应使用gzip压缩过,则还需要进行解压。
CacheInterceptor
缓存拦截器,如果命中缓存则不会发起网络请求。
ConnectInterceptor
连接拦截器,内部会维护一个连接池,负责连接复用、创建连接(三次握手等等)、释放连接以及创建连接上的socket流。
networkInterceptors
(网络拦截器) 用户自定义拦截器,通常用于监控网络层的数据传输。
CallServerInterceptor
请求拦截器,在前置准备工作完成后,真正发起了网络请求。
OkHttp缓存
HTTP缓存原理在HTTP 1.0时代,响应使用Expires头标识缓存的有效期,其值是一个绝对时间,比如Expires:Thu,31 Dec 2020 23:59:59 GMT。当客户端再次发出网络请求时可比较当前时间 和上次响应的expires时间进行比较,来决定是使用缓存还是发起新的请求。
使用Expires头最大的问题是它依赖客户端的本地时间,如果用户自己修改了本地时间,就会导致无法准确的判断缓存是否过期。
因此,从HTTP 1.1 开始使用Cache-Control头表示缓存状态,它的优先级高于Expires,常见的取值为下面的一个或多个。
private,默认值,标识那些私有的业务逻辑数据,比如根据用户行为下发的推荐数据。该模式下网络链路中的代理服务器等节点不应该缓存这部分数据,因为没有实际意义。public 与private相反,public用于标识那些通用的业务数据,比如获取新闻列表,所有人看到的都是同一份数据,因此客户端、代理服务器都可以缓存。no-cache 可进行缓存,但在客户端使用缓存前必须要去服务端进行缓存资源有效性的验证,即下文的对比缓存部分,我们稍后介绍。 ...
键盘布局自动上移
接到产品同学的需求,当用户点击控件时,自动调整布局使其上移,避免被软键盘遮挡. 按如下方法实现了:
1234567891011121314151617181920212223242526final View rootView = findViewById(android.R.id.content);rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { private int mPreviousKeyboardHeight = -1; @Override public void onGlobalLayout() { Rect r = new Rect(); rootView.getWindowVisibleDisplayFrame(r); int screenHeight = rootView.getRootView().getHeight(); ...
TimeSort算法的原理
TimSort由工程师Tim Peters于2001年首次提出,并从Python 2.3开始成为默认的排序算法。此后,它也被Java、Android、GNU Octave等多种编程语言和环境采用,显示了其卓越的性能和灵活性。那么,究竟是什么让TimSort在众多排序算法中独树一帜呢?
TimSort是插入排序和归并排序的结合体,其设计理念旨在充分利用现实世界数据中的有序段,即“自然序列”。在进行排序时,TimSort会首先扫描数据集,识别其中的连续有序序列,并将这些序列称为run。对于通常需要排序长数组的场景,TimSort凭借对小数据集处理的优化表现出色。
在小规模数据集上,插入排序尽管理论时间复杂度为O(n^2),但实际上却能取得非常高的效率,尤其当数据量小于64时,TimSort会优先应用插入排序。其原因在于插入排序在移位操作上的简单性,较少的比较次数使得它在小规模数据中处理更为高效。这种选择并非偶然,Java将插入排序的阈值设定在32,Python则为64,这样的设计都旨在提升处理速度。
除了插入排序,TimSort还通过二分查找方式优化了插入位置的确定。这不仅减少了比较的次数 ...
Android tcpdump抓包
在Android平台上使用ADB抓包,你可以使用tcpdump抓包。首先需要保证在Android设备上有root权限。
如果抓任何的数据,采用如下命令 adb shell tcpdump -i any
如果抓特定端口的包,使用如下命令
12adb shell tcpdump -i any -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'这个命令会抓取通过接口any(代表所有接口)上,目标或源端口为80的所有TCP包,并以ASCII格式输出。
Android带气泡进度条
今天接到了产品同学的一个需求,要显示带气泡的进度条,花一上午实现了需求:布局文件中定义一个进度条:
1234567<ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="200dp" android:layout_height="20dp" android:progressDrawable="@drawable/progress_bar_color" android:visibility="gone" />
bubble_layout.xml
12345678910111213141516<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android& ...
Android避免Activity白屏
避免白屏有如下几种方案:
设置Theme窗口背景:在应用的主题中设置windowBackground属性,提供一个定制的过渡颜色或图片。这样,在Activity的内容渲染完成之前,用户将会看到这个过渡背景,而不是一片空白。示例代码(在styles.xml中自定义主题):
1234<style name="AppTheme" parent="..."> <!-- ...其他属性 --> <item name="android:windowBackground">@color/transition_color</item></style>
其中,@color/transition_color应替换为你的应用中定义的一个过渡背景颜色资源引用。定义SplashActivity:
创建一个SplashActivity作为启动时的过渡界面,该Activity可以在加载主界面内容的同时显示一个加载动画或静态图片。在SplashActivity的onCr ...