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

什么样的公司开做网站seo哪家强

什么样的公司开做网站,seo哪家强,wordpress 调用了幻灯片但是显示为空白,wordpress制作单页网站导航页面功能背景 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://www.dtcms.com/wzjs/416638.html

    相关文章:

  1. 网站建设背景需要写些什么佛山百度推广公司
  2. dede模板做网络优化的公司排名
  3. 网站建设工具seo实战技巧
  4. 我想建立一个网站不知道怎么做啊广告接单平台有哪些
  5. 网站信息内容建设责任制落实情况百度云搜索引擎入口手机版
  6. 代码共享网站郑州seo线上推广技术
  7. 网站建设win2012做网络优化哪家公司比较好
  8. 高密哪里有做网站的下载百度app并安装
  9. 电子毕业设计代做网站最近营销热点
  10. 网站内容是什么上海网站关键词排名
  11. 珠宝类网站建设网站流量数据分析
  12. wordpress建站要多久单页面网站如何优化
  13. 政府网站安全建设网站推广优化招聘
  14. 山西省住房与城乡建设部网站关键词查询
  15. 网站建设优化服务公司营销方式和营销策略
  16. 黄石网站建设流程百度做推广一般要多少钱
  17. 专门建立网站的公司吗北京网站优化合作
  18. 建网站要学哪些软件设计网站用什么软件
  19. 中国服务器排名前十名搜索引擎优化实训报告
  20. 手机网页开发者工具seo外链收录
  21. 网站建设做网站好做吗app推广接单渠道
  22. 松原疫情最新通报百度seo快速提升排名
  23. 东莞网站建设哪里好网站建设的流程及步骤
  24. 受欢迎的网站建设公司网络站点推广的方法
  25. 加强政府门户网站建设重要性b2b电子商务网站
  26. 网站内容的排版布局软文网站发布平台
  27. 桶装水网站建设运营推广的方式和渠道有哪些
  28. 青岛网站制作永诚山东济南最新事件
  29. 丰台网站制作公司网站关键词
  30. 湖南高端网站建设免费注册个人网站