当前位置: 首页 > wzjs >正文

网页设计与网站建设考试名词解释app企业签名

网页设计与网站建设考试名词解释,app企业签名,电商网站建设推广,哪里app开发公司好功能背景 APN 数据通常存储在数据库中,由TelephonyProvider提供。当用户进入APN设置界面时,Activity会启动,AOSP源码通过ContentResolver查询APN数据。关键分析点在于这个查询操作是否在主线程执行,因为主线程上的耗时操作会导致…

功能背景

APN 数据通常存储在数据库中,由TelephonyProvider提供。当用户进入APN设置界面时,Activity会启动,AOSP源码通过ContentResolver查询APN数据。关键分析点在于这个查询操作是否在主线程执行,因为主线程上的耗时操作会导致ANR。

技术演进补充

自Android 9(API 28)起,系统对Telephony.Carriers表的访问增加了权限限制:

  • 需要Carrier PrivilegesWRITE_APN_SETTINGS权限
  • 查询结果可能返回空Cursor,需配合SubscriptionManager处理多SIM卡场景

分析

通常,Android的ContentProvider处理数据请求,而TelephonyProvider继承自ContentProvider。查询操作可能会在后台线程执行,但需要确认。例如,CursorLoader会在后台线程处理查询,但如果是直接使用ContentResolver.query,可能就在主线程了。

Android源码中

  • 使用LoaderManager来异步加载数据,这样查询会在后台进行。
  • 如果用户使用的是直接查询而没有异步处理,那么主线程可能被阻塞。

排查建议

检查ApnSettingsActivity的onCreate或onResume方法,看是否触发数据加载。

  • 使用LoaderManager.initLoader来启动CursorLoader,这样查询会在后台线程执行。
  • 否则,如果直接在主线程调用getContentResolver().query,就会在主线程执行数据库操作。

疑问

Q:getContentResolver().query都是在主线程执行的吗?

A:直接调用getContentResolver().query取决于调用线程。

根据Android文档,ContentResolver的query方法默认是在调用线程执行的。如果直接在主线程调用getContentResolver().query,那么查询会在主线程执行,可能导致UI卡顿甚至ANR。然而,当使用CursorLoader时,内部会使用AsyncTask或者类似的机制,在后台线程执行查询,从而避免主线程阻塞。

CursorLoader内部封装了异步查询,所以即使调用了ContentResolver的query方法,也是在Loader管理的后台线程中执行的,而不是主线程。

正确使用Loader或现代的替代方案(如Room的LiveData + ViewModel)来确保数据库操作不在主线程进行。

关键结论

  1. 直接调用:若在Activity/Fragment主线程中直接调用getContentResolver().query()确实会在主线程执行数据库操作,可能导致ANR
  2. 通过Loader机制:当使用CursorLoader时,系统自动在后台线程执行查询,通过Handler将结果回调到主线程
线程行为对比表
调用方式执行线程是否阻塞UI推荐场景
直接调用query()调用线程可能阻塞小型数据集/非UI线程调用
CursorLoader自动执行queryAsyncTask线程池无阻塞列表数据加载等标准场景

 

对疑问的代码执行流程验证

原生CursorLoader实现原理(简化版):

// Framework简化的Loader线程切换逻辑
public class CursorLoader extends AsyncTaskLoader<Cursor> {@Overridepublic Cursor loadInBackground() { // 在AsyncTask线程执行return getContext().getContentResolver().query(uri, ...);}@Overrideprotected void onStartLoading() {forceLoad(); // 触发异步加载}
}

 主线程验证代码:

// 验证调用线程的测试代码
new Handler(Looper.getMainLooper()).post(() -> {// 在主线程执行查询Cursor cursor = getContentResolver().query(Carriers.CONTENT_URI, ...);Log.d("ThreadTest", "MainThread query: " + (Looper.myLooper() == Looper.getMainLooper()));
});// 输出结果:ThreadTest: MainThread query: true

代码实现

优化设想

用户打开界面,Activity初始化Loader,LoaderManager启动CursorLoader,CursorLoader在后台线程执行查询,通过ContentResolver调用TelephonyProvider的query方法,最终获取APN数据并返回给主线程更新UI

APN Settings界面数据加载时序图(优化)
APN Settings界面数据优化加载时序图

 

%% APN Settings界面数据加载时序图
sequenceDiagramparticipant Userparticipant ApnSettingsActivityparticipant LoaderManagerparticipant CursorLoaderparticipant TelephonyProviderparticipant DatabaseUser->>ApnSettingsActivity: 启动APN设置界面activate ApnSettingsActivityApnSettingsActivity->>LoaderManager: initLoader(APN_LOADER_ID)LoaderManager->>CursorLoader: 创建新Loader实例activate CursorLoaderCursorLoader->>TelephonyProvider: 异步执行query()activate TelephonyProviderTelephonyProvider->>Database: 执行SQL查询activate DatabaseDatabase-->>TelephonyProvider: 返回APN数据Cursordeactivate DatabaseTelephonyProvider-->>CursorLoader: 返回查询结果deactivate TelephonyProviderCursorLoader-->>LoaderManager: 交付结果deactivate CursorLoaderLoaderManager->>ApnSettingsActivity: onLoadFinished()ApnSettingsActivity->>ApnSettingsActivity: 更新UI列表deactivate ApnSettingsActivityNote right of CursorLoader: 关键路径说明<br/>1. CursorLoader自动处理后台线程<br/>2. 数据库查询在AsyncTask线程池执行<br/>3. 结果通过Handler返回主线程

如下是优化方案的案例,但是原生逻辑并不是直接一个Activity

package com.android.settings.network.apn;// APN数据库查询不会阻塞主线程,通过CursorLoader机制实现
// 实际查询发生在AsyncTask线程(AsyncTask.THREAD_POOL_EXECUTOR)
// 结果回调通过Handler机制返回主线程// ApnSettings.java 核心逻辑
public class ApnSettings extends PreferenceActivity implements LoaderManager.LoaderCallbacks<Cursor> {@Overrideprotected void onCreate(Bundle savedInstanceState) {getLoaderManager().initLoader(APN_LOADER_ID, null, this); // 启动异步加载}@Overridepublic Loader<Cursor> onCreateLoader(int id, Bundle args) {return new CursorLoader(this, Telephony.Carriers.CONTENT_URI,PROJECTION, null, null, Telephony.Carriers.DEFAULT_SORT_ORDER);}@Overridepublic void onLoadFinished(Loader<Cursor> loader, Cursor data) {mAdapter.swapCursor(data); // 主线程更新UI}
}

以上符合Android的最佳实践,即避免在主线程进行IO操作。

  • ApnSettingsActivity使用了LoaderManager来初始化CursorLoader。
  • 在onCreateLoader方法中创建了CursorLoader实例,参数包括ContentProvider的URI和查询参数。
  • 当LoaderManager启动加载时,CursorLoader会在后台线程执行查询,完成后再通过onLoadFinished回调主线程更新UI。

 AOSP

packages/apps/Settings/src/com/android/settings/network/apn/ApnSettings.java

/** Handle each different apn setting. */
public class ApnSettings extends RestrictedSettingsFragmentimplements Preference.OnPreferenceChangeListener {static final String TAG = "ApnSettings";


    文章转载自:

    http://cSEGzhzI.wprxm.cn
    http://fwlOdn5d.wprxm.cn
    http://7dE6jgC6.wprxm.cn
    http://RPl7Slgy.wprxm.cn
    http://Z98bxEp9.wprxm.cn
    http://oxD5x3qV.wprxm.cn
    http://3JVkZmnN.wprxm.cn
    http://redfbC3g.wprxm.cn
    http://BvumxSMB.wprxm.cn
    http://NVQ5aID0.wprxm.cn
    http://BYlkJYZY.wprxm.cn
    http://laTIapY3.wprxm.cn
    http://HcLRca4y.wprxm.cn
    http://8CLsvjcV.wprxm.cn
    http://jReOfjwL.wprxm.cn
    http://uwA8OKSh.wprxm.cn
    http://ewZf74DY.wprxm.cn
    http://kmeQaZnY.wprxm.cn
    http://ssDPAlS0.wprxm.cn
    http://erK6KfEF.wprxm.cn
    http://WWiozFj9.wprxm.cn
    http://wHLk1rpM.wprxm.cn
    http://fc2ldfQZ.wprxm.cn
    http://kjOiLgYp.wprxm.cn
    http://eMTPgzdQ.wprxm.cn
    http://lWZeCmJ8.wprxm.cn
    http://OjAu5INv.wprxm.cn
    http://GlQmJbA2.wprxm.cn
    http://U3cfJedc.wprxm.cn
    http://mYC3JyYx.wprxm.cn
    http://www.dtcms.com/wzjs/654033.html

    相关文章:

  1. 怎么建立购物网站白云怎样优化网站建设
  2. 专业网站建设公司推荐同城的网站建设
  3. 昆明网站建设云集创做教育网站挣钱
  4. 大型网站建设济南兴田德润o评价商城网站的基本功能
  5. html 网站添加悬浮二维码手机网页版网站开发
  6. 网站建设 步骤电子工程网介绍
  7. 类似网站的建设黄石做企业网站
  8. 南山做网站公司在哪里微信公众号如何开通小程序
  9. 济南制作网站的公司哪家好wordpress oracle
  10. 网页设计与网站开发试卷上海网站 建设
  11. wordpress网站前台密码广告制作合同
  12. 网络创作网站景区网站建设费用
  13. 域名注册后如何建网站微视频网站源码
  14. 做一个属于自己的网站水墨风格的网站
  15. 网站开发商换了简单的页面
  16. wordpress更改固定链接显示404苏州网站制作排名优化
  17. 电话销售企业网站怎么做虎嗅 wordpress
  18. 经营网站如何挣钱创建游戏的软件
  19. 宁波建设银行网站分部海南通信建设有限公司官方网站
  20. 怎么用网站做word文件格式济南手机网站开发公司
  21. 公司起名网站十大排名成立一个做网站的工作室
  22. 上海网站设计大连青海省建设局网站首页
  23. 县总工会网站建设情况介绍网址导航网站怎样做
  24. 邯郸网站建设浩森宇特太原域名注册
  25. 网站管理员登录入口2021年最火的网页游戏
  26. 衡水提供网站设计公司哪家专业WordPress模板转换typecho
  27. 旅游网站建设的参考文献wordpress适合做什么网站吗
  28. iis网站正在建设中亚马逊跨境电商下载
  29. 定制网站建设托管wordpress 指定
  30. 什么是建设网站工具南昌百恒信息技术有限公司