导航:首页 > 异常信息 > android网络框架异常处理

android网络框架异常处理

发布时间:2022-08-31 21:59:03

1. 网络请求框架-OkHttp原理解析

okhttp是square公司贡献的一个处理网络请求的开源框架,是目前Android开发使用最广泛的一个网络框架,从Android4.4开始,httpURLconnection的底层实现采用的就是okhttp。内部实现就是利用java基础,对socket进行封装,实现http通信。最重要的两个关键点就是分发器和5个拦截器。
分发器 就是内部维护队列和线程池,完成请求分配,总结就是用于对异步任务加入队列管理,然后判断条件,控制数量,加入线程池执行异步请求任务。
五个默认拦截器 就是利用责任链模式对网络请求进行层层处理,完成整个请求过程,简单总结如下。
1.桥接拦截器对用户发出的请求添加缺少的请求配置字段,比如keep-alive等
2.缓存拦截器就是查询有没有符合判断条件的已缓存的网络请求,执行复用,直接返回response
3.连接拦截器就是创建请求,加入连接器 或者访问连接池,根据条件判断,是否能怼已创建的tcp请求进行复用
4.请求服务器拦截器就是对scoket进行操作,请求网络访问服务器,返回response,
5.重试和重定向拦截器就是对返回的response进行code判断,决定是否要重试或者重定向操作。

1.支持http2.0版本,并且允许对同一主机的所有请求共享一个套接字
2.即使不是http2.0版本,通过连接池,减少请求延迟
3.默认使用Gzip 压缩数据
4.响应缓存,避免重复请求网络

最简单的http请求案例

1.利用建造者模式构建okHttpClient实例对象,构建过程中可以动态配置参数,请求时间,响应时间,缓存信息等。
2.创建Request对象,设置请求方式,链接地址,参数等信息。
3.把request对象,传给client,通过newCall函数,得到RealCall对象。

4.RealCall 分为同步和异步执行
5.同步执行时,分发器只是做个记录,把请求任务加到队列中,然后直接通过拦截器访问服务器,返回response。

6.异步执行
6.1先对异步任务进一步封装,把任务放到AsyncCall对象中

2.分发器 把 封装后的异步任务 添加到等待运行的队列中

7. 通过拦截器,获取response
okhttp 默认提供5个拦截器 重试重定向拦截器,桥接拦截器,缓存拦截器,连接拦截器,访问服务器拦截器。还可以自定义拦截器。
自定义拦截器分为应用拦截器(通过addInterceptor 添加)和网络拦截器(通过addNetworkInterceptor拦截)

拦截器采用责任链的设计默认,让请求者和处理者解耦,最终请求从前往后,响应从后往前。

首先先判断用户是否取消了请求,如果没有取消,就把请求交个桥接拦截器。
在获得响应结果response的时候根据响应码,判断是否需要重试或者重定向, 重试不限制次数,重定向最多20次 ,如果需要重试或者重定向,那么会再一次重新执行所有拦截器。
有如下几种情况不会重试:IO异常,线路异常,配置client实例时配置不允许重试,协议异常,证书异常等等。

先获取用户发送的请求,判断条件用户是否已经配置过请求头字段,若用户没有配置,则将http协议必备的请求头字段补齐,比如Content-Type,Content-Length等,然后交给下一个拦截器。
在获得响应结果response之后,调用保存cookie的接口(也可以在配置client的时候,设置cookjar进行cookie回调数据),并且解析gzip数据

获取结果之后,对cookie进行保存,对返回的数据进行gzip解压

就是根据缓存策略从缓存中查找是否有合适的缓存response,如果有合适的缓存,直接返回给请求任务,不在继续执行后面的拦截器。
获得响应结果response后,根据条件判断,决定是否要缓存。

维护一个连接池,负责对连接的服务。在把请求交给下一个拦截器之前。会先在连接池中找到一个合适的连接(满足适配条件相同,并且没有正在被使用)或者新建一个连接,并且接入连接池,获得对应的socket流,把请求交给下一个拦截器。获得response结果后不会进行额外的处理。

连接池, 也称之为对象池,主要用来存放request请求连接,内部维护了一个LinkedQueue队列用来存放请求。在添加新的请求对象时,都会执行一个周期性任务,用以对连接池进行清理操作。
1.队列长度超过5,清理最近未被使用连接,LRE算法
2.存储的连接,5分钟未被复用,清理

拿到上一个拦截器返回的请求,真正的与服务器进行通信,向服务器发送数据,解析读取响应的数据,返回给上一个拦截器。

1.创建request =>OkHttpClient=>RealCall()
2.同步执行 ,分发器添加同步任务,执行拦截器,访问服务器,返回reponse,触发异步分发流程。
3.异步执行 ,封装任务= >AsyncCall ,实现runnable接口。添加任务到异步任务等待队列,执行分发任务,判断异步任务是否能加入正在执行的异步任务队列,满足两个条件
同时执行的异步任务数量不得大于64个
对同一个主机的访问任务,最多不得大于5个
4.加入正在执行的异步任务队列,通过线程池执行任务,经过5个默认拦截器访问服务器,返回response,执行异步任务分发。

分发器工作 分为同步任务和异步任务两种
同步任务 就是把任务加入同步任务队列,加个标记,执行结束之后,触发异步任务的分发操作。
异步任务 先封装任务到asyncCall对象,实现了runnable接口。把任务加入等待执行队列,执行分发操作。
先遍历等待任务队列,判断是否符合加入正在运行的异步任务队列,要同时满足两个条件。
同时执行的异步任务数量不得大于64个
对同一个主机的访问任务,最多不得大于5个
当满足条件后,从等待队列中删除任务,把任务加入正在执行的队列中,通过自定义的线程池,执行任务,任务执行结束后,再次执行分发操作。

拦截器采用了责任链设计默认,让请求者和执行者解耦,请求者只需要将请求发给责任链即可,无需关心请求过程和细节。okHttp 默认有5个拦截器,重试重定向拦截器,桥接拦截器,缓存拦截器,连接拦截器,请求服务拦截器。工作细节参考上面拦截器原理分析部分

1.位置的关系,应用拦截器 放在责任链最顶端,网络拦截器放在责任链倒数第二的位置。所以应用拦截器 最先拦截,最后响应,网络拦截器 倒数第二拦截,第二响应。如果打印请求日志的情况,应用拦截器打印的是用户请求信息,经过重试重定向,桥接,缓存,链接 等拦截器的层层包装,网络拦截器打印的是实际请求的信息。
2.应用拦截器一定会被执行,网络拦截器不一定被执行。

利用连接池,缓存所有的有效连接对象。
清理机制:垃圾连接
1.超过5分钟没有用过的链接
2.超过5个闲置链接后,从最久闲置的链接开始执行清理(LRU)

2. 如何解决EnterLib异常处理框架最大的局限——基于异常"类型"的异常处理策略

但是,在我看来,EHAB有一个最大的局限,把就是异常处理策略的粒度过大——只能提供基于异常类型级别。本篇文章通过一个自定义ExceptionHandler很好地解决了这个问题。一、EnterLib基于异常类型的异常处理策略EnterLib的异常处理策略基本上可以通过这样的的公式来表示:Exception Policy = Exception Type + Exception Handlers + Post Handling Action,它表达的意思是:“对于某种类型的异常,应该采用哪些Exception Handler去处理,而被处理后的异常还需要采用怎样的后续操作(将异常吃掉、或者是重新抛出)”。也就是说,抛出类型的异常类型决定了最终采取的处理策略,这在大部分情况下是可以接受的。但是在很多场景中,不同情况下也可以抛出相同类型的异常,我们期望的行为是:尽管异常类型一样,我们也可以根据具体抛出的异常定义不同的异常处理策略。一个最为典型的场景就是基于数据库的数据存取,如果你采用的SQL Server,抛出的异常永远只有一种:SqlException。如果完全按照EnterLib EHAB的做法,在任何情况下抛出的SqlException对应的处理方式都是一样的。但是抛出SqlException的情况非常多,比如Server连接断开、认证失败、数据库对象不存在、违反一致性约束等等,如果异常处理框架能够根据最终抛出的异常的具体属性,“智能”地应用相应的策略去处理,这才是我们乐于看到的。二、一个特殊的ExceptionHandler——FilterableHandler为了解决这个问题,我创建了一个特殊的Exception Handler,我将它起名为FilterableHandler。说它特别,是因为FilterableHandler并不从事具体的异常处理操作(比如异常封装、替换、日志等),而是为某个具体的异常类型重新定义了异常处理策略。实际上,我在很早之前就定义了一个相似的FilterableHandler,有兴趣的话可以参考《创建一个自定义Exception Handler改变ELAB的异常处理机制》。由于在最新的EnterLib中,底层的实现机制发生了根本性的改变,这个ExceptionHandler已经不能在使用。所以我对其进行的了修正,同时根据可扩展性进行重新设计。之所以称这个ExceptionHandler为FilterableHandler,是在于它具有对抛出的异常具有“筛选”的功能。说得具体点,FilterableHandler将抛出的异常对象,传入一组具有筛选功能的ExceptionHandler列表,我个人将这个列表命名为。对象包含一个筛选器和一组ExceptionHandler,如果传入的异常通过了筛选器的筛选,该异常最终被分发到相应的ExceptionHandler列表中进行处理。大概的定义如下: 1:publicclass FilterableHandlerPipeline 2: { 3:public IFilter Filter { get; private set; } 4:public IEnumerable ExceptionHandlers { get; private set; } 5: 6:public FilterableHandlerPipeline(IFilter filter, IEnumerable exceptionHandlers) 7: { 8: Guard.ArgumentNotNull(filter, "filter"); 9: Guard.ArgumentNotNull(exceptionHandlers, "exceptionHandlers"); 10:this.Filter = filter; 11:this.ExceptionHandlers = exceptionHandlers; 12: } 13: }而IFilter接口在更为简单,仅仅具有如下一个唯一的Match方法。布尔类型的返回值表明是否和指定的异常相匹配,当返回值为True的时候,采用用自己的ExceptionHandler列表去处理抛出的异常,否则就直接忽略掉。 1:publicinterface IFilter 2: { 3:bool Match(Exception ex); 4: }你可以从下面给出的关于FilterableHandler的完整的代码去分析具体的异常处理实现原理。而实际上,最为复杂的不是FilterableHandler本身的实现,而是与之相关的配置元素的定义。由于这会涉及到很多关于EnterLib底层和Unity相关的知识点,不是三言两语就能讲明白的,所以在这里就不对FilterableHandler的配置体系作介绍了,有兴趣的话可以通过这里直接下载源代码。 1: [ConfigurationElementType(typeof(FilterableHandlerData))] 2:publicclass FilterableHandler:IExceptionHandler 3: { 4:public IEnumerable FilterableHandlerPipelines { get; private set; } 5:public IEnumerable DefaultHandlers { get; private set; } 6: 7:public FilterableHandler(IEnumerable filterableHandlerPipelines, IEnumerable defaultHandlers) 8: { 9: Guard.ArgumentNotNull(defaultHandlers, "defaultHandlers"); 10: filterableHandlerPipelines = filterableHandlerPipelines ? new List(); 11:this.FilterableHandlerPipelines = filterableHandlerPipelines; 12:this.DefaultHandlers = defaultHandlers; 13: } 14:public Exception HandleException(Exception exception, Guid handlingInstanceId) 15: { 16: Guard.ArgumentNotNull(exception,"exception"); 17: var handlerPipeline = (from pipeline inthis.FilterableHandlerPipelines 18:where pipeline.Filter.Match(exception) 19: select pipeline).FirstOrDefault(); 20:if (null != handlerPipeline) 21: { 22:return ExecuteHandlerChain(exception, handlingInstanceId, handlerPipeline.ExceptionHandlers); 23: } 24:else 25: { 26:return ExecuteHandlerChain(exception, handlingInstanceId, DefaultHandlers); 27: } 28: } 29: 30:privatestatic Exception ExecuteHandlerChain(Exception exception, Guid handlingInstanceId, IEnumerable handlers) 31: { 32: var lastHandlerName = String.Empty; 33:try 34: { 35:foreach (var handler in handlers) 36: { 37: lastHandlerName = handler.GetType().Name; 38: exception = handler.HandleException(exception, handlingInstanceId); 39: } 40: } 41:catch (Exception ex) 42: { 43: var errorMsg = string.Format("Unable to handle the exception: {0}", lastHandlerName); 44:thrownew ExceptionHandlingException(errorMsg, ex); 45: } 46:return exception; 47: } 48: }三、通过FilterableHandler对SqlException进行针对性处理我现在通过一个简单的例子来演示FilterableHandler如何使用(源代码从这里下载),我们使用的场景就是上面提到过的对SqlException的针对性处理。根据SqlException抛出的场景,本例将起分为三种类型:系统异常:基于SQL Server自身抛出的异常,我们将异常编号,即SqlException的Number小于50000的称为系统异常; 业务异常:编程人员根在编写SQL脚本的时候,根据相应的业务逻辑,通过调用RAISERROR语句手工抛出的异常。在默认情况下这种异常的编号为50000; 其他:任何编号高于50000的异常。 注:关于RAIERROR语句以及SQL Server异常处理相关的内容,你可以参阅我下面三篇文章:谈谈基于SQL Server的Exception Handling - PART I谈谈基于SQL Server 的Exception Handling - PART II谈谈基于SQL Server 的Exception Handling - PART III为了对SqlException进行针对处理,我们对抛出的SqlException进行封装。对应于上述三种类型,我定义如如下三种异常:SqlSystemException、SqlBusinessException和DbException。 1:namespace Artech.ExceptionHandling.Demo 2: { 3: [Serializable] 4:publicclass SqlSystemException : Exception 5: { 6:public SqlSystemException() { } 7:public SqlSystemException(string message) : base(message) { } 8:public SqlSystemException(string message, Exception inner) : base(message, inner) { } 9:protected SqlSystemException( 10: System.Runtime.Serialization.SerializationInfo info, 11: System.Runtime.Serialization.StreamingContext context) 12: : base(info, context) { } 13: } 14: 15: [Serializable] 16:publicclass SqlBusinessException : Exception 17: { 18:public SqlBusinessException() { } 19:public SqlBusinessException(string message) : base(message) { } 20:public SqlBusinessException(string message, Exception inner) : base(message, inner) { } 21:protected SqlBusinessException( 22: System.Runtime.Serialization.SerializationInfo info, 23: System.Runtime.Serialization.StreamingContext context) 24: : base(info, context) { } 25: } 26: 27: [Serializable] 28:publicclass DbException : Exception 29: { 30:public DbException() { } 31:public DbException(string message) : base(message) { } 32:public DbException(string message, Exception inner) : base(message, inner) { } 33:protected DbException( 34: System.Runtime.Serialization.SerializationInfo info, 35: System.Runtime.Serialization.StreamingContext context) 36: : base(info, context) { } 37: } 38: }我们需要作的进行通过配置定义处理SqlException的处理策略,整个配置定义在如下的代码片断中。 1:

3. 做什么transactiontoolargeexception问题,怎么解决

AndroidN除了提供诸多新特性和功能外,还对系统和API行为做出了各种变更。本文重点介绍您应该了解并在开发应用时加以考虑的一些重要变更。如果您之前发布过Android应用,请注意您的应用可能受到这些平台变更的影响。电池和内存AndroidN包括旨在延长设备电池寿命和减少RAM使用的系统行为变更。这些变更可能会影响您的应用访问系统资源,以及您的系统通过特定隐式Intent与其他应用互动的方式。低电耗模式Android6.0(API级别23)引入了低电耗模式,当用户设备未插接电源、处于静止状态且屏幕关闭时,该模式会推迟CPU和网络活动,从而延长电池寿命。而AndroidN则通过在设备未插接电源且屏幕关闭状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分CPU和网络限制,进一步增强了低电耗模式。图1.低电耗模式如何应用第一级系统活动限制以延长电池寿命的图示。当设备处于充电状态且屏幕已关闭一定时间后,设备会进入低电耗模式并应用第一部分限制:关闭应用网络访问、推迟作业和同步。如果进入低电耗模式后设备处于静止状态达到一定时间,系统则会对PowerManager.WakeLock、AlarmManager闹铃、GPS和Wi-Fi扫描应用余下的低电耗模式限制。无论是应用部分还是全部低电耗模式限制,系统都会唤醒设备以提供简短的维护时间窗口,在此窗口期间,应用程序可以访问网络并执行任何被推迟的作业/同步。图2.低电耗模式如何在设备处于静止状态达到一定时间后应用第二级系统活动限制的图示。请注意,激活屏幕或插接设备电源时,系统将退出低电耗模式并取消这些处理限制。此项新增的行为不会影响有关使您的应用适应Android6.0(API级别23)中所推出的旧版本低电耗模式的建议和最佳实践,如低电耗模式和应用待机模式优化中所讨论。您仍应遵循这些建议(例如使用GoogleCloudMessaging(GCM)发送和接收消息)并开始安排更新计划以适应新增的低电耗模式行为。ProjectSvelte:后台优化AndroidN删除了三项隐式广播,以帮助优化内存使用和电量消耗。此项变更很有必要,因为隐式广播会在后台频繁启动已注册侦听这些广播的应用。删除这些广播可以显着提升设备性能和用户体验。移动设备会经历频繁的连接变更,例如在Wi-Fi和移动数据之间切换时。目前,可以通过在应用清单中注册一个接收器来侦听隐式CONNECTIVITY_ACTION广播,让应用能够监控这些变更。由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。同理,应用可以注册接收来自其他应用(例如相机)的隐式ACTION_NEW_PICTURE和ACTION_NEW_VIDEO广播。当用户使用相机应用拍摄照片时,这些应用即会被唤醒以处理广播。为缓解这些问题,AndroidN应用了以下优化措施:面向AndroidN开发的应用不会收到CONNECTIVITY_ACTION广播,即使它们已有清单条目来请求接受这些事件的通知。在前台运行的应用如果使用BroadcastReceiver请求接收通知,则仍可以在主线程中侦听CONNECTIVITY_CHANGE。应用无法发送或接收ACTION_NEW_PICTURE或ACTION_NEW_VIDEO广播。此项优化会影响所有应用,而不仅仅是面向AndroidN的应用。如果您的应用使用任何Intent,您仍需要尽快移除它们的依赖关系,以正确适配AndroidN设备。Android框架提供多个解决方案来缓解对这些隐式广播的需求。例如,JobSchelerAPI提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。您甚至可以使用JobScheler来适应内容提供程序变化。如需了解有关AndroidN中后台优化以及如何改写应用的详细信息,请参阅后台优化。权限更改AndroidN做了一些权限更改,这些更改可能会影响您的应用。系统权限更改为了提高私有文件的安全性,面向AndroidN或更高版本的应用私有目录被限制访问(0700)。此设置可防止私有文件的元数据泄漏,如它们的大小或存在。此权限更改有多重副作用:私有文件的文件权限不应再由所有者放宽,为使用MODE_WORLD_READABLE和/或MODE_WORLD_WRITEABLE而进行的此类尝试将触发SecurityException。注:迄今为止,这种限制尚不能完全执行。应用仍可能使用原生API或FileAPI来修改它们的私有目录权限。但是,我们强烈反对放宽私有目录的权限。传递软件包网域外的file://URI可能给接收器留下无法访问的路径。因此,尝试传递file://URI会触发FileUriExposedException。分享私有文件内容的推荐方法是使用FileProvider。DownloadManager不再按文件名分享私人存储的文件。旧版应用在访问COLUMN_LOCAL_FILENAME时可能出现无法访问的路径。面向AndroidN或更高版本的应用在尝试访问COLUMN_LOCAL_FILENAME时会触发SecurityException。通过使用DownloadManager.Request.()或DownloadManager.Request.()将下载位置设置为公共位置的旧版应用仍可以访问COLUMN_LOCAL_FILENAME中的路径,但是我们强烈反对使用这种方法。访问由DownloadManager公开的文件的首选方式是使用ContentResolver.openFileDescriptor()。应用间共享文件对于面向AndroidN的应用,Android框架执行的StrictModeAPI政策禁止向您的应用外公开file://URI。如果一项包含文件URI的Intent离开您的应用,应用失败,并出现FileUriExposedException异常。若要在应用间共享文件,您应发送一项content://URI,并授予URI临时访问权限。进行此授权的最简单方式是使用FileProvider类。如需有关权限和共享文件的信息,请参阅共享文件。无障碍改进为提高平台对于视力不佳或视力受损用户的可用性,AndroidN做出了一些更改。这些更改一般并不要求更改您的应用代码,不过您应仔细检查并使用您的应用测试这些功能,以评估它们对用户体验的潜在影响。屏幕缩放AndroidN支持用户设置显示尺寸,以放大或缩小屏幕上的所有元素,从而提升设备对视力不佳用户的可访问性。用户无法将屏幕缩放至低于最小屏幕宽度sw320dp,该宽度是Nexus4的宽度,也是常规中等大小手机的宽度。图3.右侧屏幕显示的是一台运行AndroidN系统映像的设备增大显示尺寸后的效果。当设备密度发生更改时,系统会以如下方式通知正在运行的应用:如果是面向API级别23或更低版本系统的应用,系统会自动终止其所有后台进程。这意味着如果用户切换离开此类应用,转而打开“Settings”屏幕并更改Displaysize设置,则系统会像处理内存不足的情况一样终止该应用。如果应用具有任何前台进程,则系统会如处理运行时变更中所述将配置变更通知给这些进程,就像对待设备屏幕方向变更一样。如果是面向AndroidN的应用,则其所有进程(前台和后台)都会收到有关配置变更的通知,如处理运行时变更中所述。大多数应用并不需要进行任何更改即可支持此功能,不过前提是这些应用遵循Android最佳实践。具体要检查的事项:在屏幕宽度为sw320dp的设备上测试您的应用,并确保其充分运行。当设备配置发生变更时,更新任何与密度相关的缓存信息,例如缓存位图或从网络加载的资源。当应用从暂停状态恢复运行时,检查配置变更。注:如果您要缓存与配置相关的数据,则最好也包括相关元数据,例如该数据对应的屏幕尺寸或像素密度。保存这些元数据便于您在配置变更后决定是否需要刷新缓存数据。避免用像素单位指定尺寸,因为像素不会随屏幕密度缩放。应改为使用与密度无关像素(dp)单位指定尺寸。设置向导中的视觉设置AndroidN在“Welcome”屏幕中加入了“VisionSettings”,用户可以在新设备上设置以下无障碍功能设置:Magnificationgesture、Fontsize、Displaysize和TalkBack。此项变更增强了与不同屏幕设置相关的错误的可见性。要评估此功能的影响,您应在启用这些设置的状态下测试应用。您可以在Settings>Accessibility中找到这些设置。NDK应用链接至平台库AndroidN做了一些命名空间更改,以阻止加载非公开API。如果您使用NDK,则只能使用Android平台提供的公开API。在下一个官方发布的Android版本上使用非公开API会导致应用崩溃。为提醒您使用了非公开API,在AndroidN设备上运行的应用会在有应用调用非公开API时在日志消息输出中生成一个错误。此错误还会作为消息显示在设备屏幕上,以帮助增强您对此情况的认识。您应检查应用代码以删除使用非公开平台API,并使用预览版设备或模拟器全面测试应用。如果您的应用依赖平台库,则请参见NDK文档,了解使用公开API等效项替换普通私有API的典型修复。您还可以链接至平台库,而无需实现此应用,如果应用使用的库是平台的一部分(例如libpng),但不属于NDK,则更可如此。此情况下,请确保您的APK包含您打算链接到的所有.so文件。注意:有些第三方库可能会链接至非公开API。如果您的应用使用这些库,那么当您的应用在下一个官方发布的Android版本上运行时可能会出现崩溃现象。应用不应依赖或使用不属于NDK的原生库,因为这些库可能会发生更改或从一个Android版本迁移至另一版本。例如,从OpenSSL切换至BoringSSL即属于此类更改。此外,不同的设备可能提供不同级别的兼容性,因为不属于NDK中的平台库没有兼容性要求。如果您必须在较旧设备上访问非NDK库,则请依据AndroidAPI级别进行加载。为帮助您诊断此类问题,下面列举了一些在您试图使用AndroidN开发应用时可能遇到的Java和NDK错误:Java错误示例:java.lang.UnsatisfiedLinkError:dlopenfailed:library"/system/lib/libcutils.so""classloader-namespace"NDK错误示例:dlopenfailed:cannotlocatesymbol"__system_property_get"referencedby以下是遇到这类错误的应用的一些典型修复:可以使用标准JNI函数来替代使用libandroid_runtime.so中的getJavaVM和getJNIEnv:AndroidRuntime::getJavaVM->GetJavaVMfromAndroidRuntime::getJNIEnv->JavaVM::GetEnvorJavaVM::AttachCurrentThreadfrom.可以使用公开alternative__system_property_get来替代使用libcutils.so中的property_get符号。如需这样做,请使用__system_property_get及以下include函数:#include应使用应用本地版本来替代使用libcrypto.so中的SSL_ctrl符号。例如,您应在.so文件中静态链接libcyrpto.a,或者在应用中包含您自己的来自BoringSSL或OpenSSL的动态libcrypto.so。AndroidforWorkAndroidN包含一些针对面向AndroidforWork的应用的变更,包括对证书安装、密码重置、二级用户管理、设备标识符访问权限的变更。如果您是要针对AndroidforWork环境开发应用,则应仔细检查这些变更并相应地修改您的应用。您必须先安装授权证书安装程序,然后DPC才能对其进行设置。对于面向NSDK的个人资料和设备所有者应用,您应在设备策略控制器(DPC)调用DevicePolicyManager.setCertInstallerPackage()之前安装授权证书安装程序。如果尚未安装此安装程序,则系统会引发IllegalArgumentException。针对设备管理员的重置密码限制现在也适用于个人资料所有者。设备管理员无法再使用DevicePolicyManager.resetPassword()来清除或更改已经设置的密码。设备管理员仍可以设置密码,但只能在设备没有密码、PIN或图案时这样做。即使设置了限制,设备所有者和个人资料所有者仍可以管理帐户。而且,即使具有DISALLOW_MODIFY_ACCOUNTS用户限制,设备所有者和个人资料所有者仍可调用AccountManagementAPI。设备所有者可以更轻松地管理二级用户。当设备在设备所有者模式下运行时,系统将自动设置DISALLOW_ADD_USER限制。这样可以防止用户创建非托管二级用户。此外,CreateUser()和createAndInitializeUser()方法已弃用,取而代之的是DevicePolicyManager.createAndManageUser()方法。设备所有者可以访问设备标识符。设备所有者可以使用DevicePolicyManagewr.getWifiMacAddress()访问设备的Wi-FiMAC地址。如果设备上从未启用Wi-Fi,则此方法将返回一个null值。工作模式设置控制工作应用访问。当工作模式关闭时,系统启动器通过使工作应用显示为灰色来指示它们不可用。启用工作模式会再次恢复正常行为。如需了解有关AndroidN中针对AndroidforWork所做变更的详细信息,请参阅AndroidforWork更新。注解保留AndroidN在注解可见性被忽略时修复错误。这种问题将启用本不应被允许的运行时访问注解。这些注解包括:VISIBILITY_BUILD:仅应编译时可见。VISIBILITY_SYSTEM:运行时应可见,但仅限基本系统。如果您的应用依赖这种行为,请在注解中添加一项运行时必须可用的保留政策。您可通过使用@Retention(RetentionPolicy.RUNTIME)来如此做。其他重要说明如果一个应用在AndroidN上运行,但却是针对更低API级别开发的,那么在用户更改显示尺寸时,系统将终止此应用进程。应用必须能够正常处理此情景。否则,当用户从最近使用记录中恢复运行应用时,应用将会出现崩溃现象。您应测试应用以确保不会发生此行为。要进行此测试,您可以通过DDMS手动终止应用,以造成相同的崩溃现象。在密度发生更改时,系统不会自动终止面向N及更高版本的应用;不过,这些应用仍可能对配置变更做出不良响应。AndroidN上的应用应能够正常处理配置变更,并且在后续启动时不会出现崩溃现象。您可以通过更改字体大小(Setting>Display>Fontsize)并随后从最近使用记录中恢复运行应用,来验证应用行为。由于之前的Android版本中的一项错误,系统未能将对主线程上的一个TCP套接字的写入操作举报为严格模式违反。AndroidN修复了此错误。呈现出这种行为的应用引发android.os.NetworkOnMainThreadException。一般情况下,我们不建议在主线程上执行网络操作,因为这些操作通常都有可能导致ANR和卡顿的高尾延迟。Debug.startMethodTracing()方法族现在默认在您的共享的存储空间上的软件包特定目录中存储输出,而非SD卡顶级。这意味着应用不再需要请求WRITE_EXTERNAL_STORAGE使用这些API的权限。许多平台API现在开始检查在Binder事务间发送的大负载,系统现在会将TransactionTooLargeExceptions再次作为RuntimeExceptions引发,而不再只是默默记录或抑制它们。一个常见例子是在Activity.onSaveInstanceState()上存储过多数据,导致ActivityThread.StopInfo在您的应用面向AndroidN时引发RuntimeException。如果应用向View发布Runnable任务,并且View未附加到窗口,系统会用View为Runnable任务排队;在View附加到窗口之前,Runnable任务不会执行。此行为会修复以下错误:如果一项应用是从并非预期窗口UI线程的其他线程发布到View,则Runnable可能会因此运行错误的线程。如果Runnable任务是从并非环路线程的其他线程发布,则应用可能会曝光Runnable任务。如果AndroidN上一项有DELETE_PACKAGES权限的应用尝试删除一个软件包,但另一项应用已经安装了这个软件包,则系统可能要求用户确认。在这种情况下,应用在调用PackageInstaller.uninstall()时的返回状态应为STATUS_PENDING_USER_ACTION。

4. 安卓anr和crash的区别

CRASH是程序崩溃的意思,ANR是经常遇到的CRASH报错,ANR就是内存溢出,比如图片加载过大,线程开太多就会出现这个错误,可以这么理解,ANR是CRASH的一种而已。

5. android客户端运行报错,怎么解决

1、可以通过一些第三方框架来采集错误日志
2、可以自己写 UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告. 然后将日志上传服务器或者发送到你的邮箱什么的
3、写代码的时候可以使用try catch的方式,这样保证不会随意崩溃

阅读全文

与android网络框架异常处理相关的资料

热点内容
网络共享中心没有网卡 浏览:538
电脑无法检测到网络代理 浏览:1390
笔记本电脑一天会用多少流量 浏览:646
苹果电脑整机转移新机 浏览:1390
突然无法连接工作网络 浏览:1128
联通网络怎么设置才好 浏览:1245
小区网络电脑怎么连接路由器 浏览:1105
p1108打印机网络共享 浏览:1225
怎么调节台式电脑护眼 浏览:762
深圳天虹苹果电脑 浏览:998
网络总是异常断开 浏览:632
中级配置台式电脑 浏览:1061
中国网络安全的战士 浏览:650
同志网站在哪里 浏览:1439
版观看完整完结免费手机在线 浏览:1473
怎样切换默认数据网络设置 浏览:1125
肯德基无线网无法访问网络 浏览:1304
光纤猫怎么连接不上网络 浏览:1543
神武3手游网络连接 浏览:981
局网打印机网络共享 浏览:1017