Android Widget中OkHttp调用OpenWeather API代码不执行原因排查
可能的故障原因如下:
- 未申请网络权限
Android系统默认禁止应用访问网络,你需要在AndroidManifest.xml中添加网络权限声明,否则所有网络请求都会直接抛出异常终止:<uses-permission android:name="android.permission.INTERNET" /> - 明文HTTP请求被拦截
如果你使用的OpenWeather API地址是http开头而非https,Android 9及以上系统默认禁止明文HTTP请求,会直接阻断请求。修复方式可以是将接口地址替换为HTTPS版本,也可以配置networkSecurityConfig放开对应域名的明文访问限制。 - 代码存在空指针隐患
当网络请求触发IOException时,你的response变量会保持null,后续直接调用response.code()会触发空指针异常,直接终止AsyncTask任务,普通日志根本捕获不到这个崩溃。需要先判断response != null再读取状态码。 - RemoteViews更新后未触发Widget刷新
你调用widgetView.setTextViewText只是修改了RemoteViews对象的属性,必须主动调用AppWidgetManager.updateAppWidget(对应的WidgetID, widgetView)才能让桌面的Widget实际刷新展示新内容,大部分情况下你以为请求没执行,实际上是请求成功了但界面没更新。 - AsyncTask本身的限制
AsyncTask在Android 3.0之后默认是串行执行的,如果有其他未完成的AsyncTask任务阻塞了队列,你的请求任务会一直排队无法执行。而且AsyncTask早已在Android 11中被正式移除,高版本系统上直接调用会无法执行任务,建议替换为OkHttp自带的异步enqueue方法或者协程、WorkManager来执行异步任务。 - 接口请求本身失败
比如OpenWeather的API_KEY填写错误、请求参数错误,会导致接口返回4xx/5xx错误,你的代码只处理了状态码200的情况,其他状态码没有任何日志输出,你会误以为请求没有执行。建议在异常捕获和非200状态码分支都加上日志,排查请求的实际返回结果。 - 系统后台任务限制
Android 8.0及以上系统对后台进程的生命周期有严格限制,onUpdate回调的生命周期非常短,如果你的请求还没执行完成,进程就被系统回收,任务自然会中断。这种场景建议用WorkManager来调度网络请求,保证任务可以正常执行完成。
内容的提问来源于stack exchange,提问作者kirvel
相关产品推荐
相关产品推荐

