18.3.5 SHTTPD方法解析的实现

本文介绍了SHTTPD服务器如何解析HTTP请求方法,通过比较字符串的方式匹配请求方法,如GET、POST、PUT、DELETE等,并定义了相应的结构体vec及方法数组_shttpd_methods。

18.3.5  SHTTPD方法解析的实现

服务器SHTTPD请求方法的解析比较简单,使用比较字符串的方法。建立一个表示请求方法的结构数组,逐个比较客户端请求方法的字符串和数组中成员请求方法的异同。请求方法的结构如下,ptr表示请求方法的名称,len表示请求方法的长度,type表示请求方法的类型。

 

typedef struct vec

{

    char                        *ptr;       /*字符串*/

    int                         len;        /*字符串长度*/

    SHTTPD_METHOD_TYPE type;                /*字符串表示类型*/

}vec;

建立一个结构数组_shttpd_methods,将各种结构放入:

 

struct vec _shttpd_methods[] = {

    {"GET",     3, METHOD_GET},             /*GET方法*/

    {"POST",    4, METHOD_POST},            /*POST方法*/

    {"PUT",     3, METHOD_PUT},             /*PUT方法*/

    {"DELETE",  6, METHOD_DELETE},          /*DELETE方法*/

    {"HEAD",    4, METHOD_HEAD},            /*HEAD方法*/

    {NULL,      0}                          /*结尾*/

};

 

将客户端的请求方法与请求方法的结构数组进行比较,返回找到的匹配项。

 

struct vec *m= NULL;

/*查找比较方法字符串*/

for(m = &_shttpd_methods[0];m->ptr!=NULL;m++)

{

    if(!strncmp(m->ptr, pos, m->len))/*比较字符串*/

    {

        req->method = m->type;/*更新头部方法*/

        found = 1;

        break;

    }

}

09-15 15:35:47.644037 7887 7887 E .oplus.crashbox: Unknown bits set in runtime_flags: 0x40000000 09-15 15:35:47.644181 7887 7887 I .oplus.crashbox: Using CollectorTypeCC GC. 09-15 15:35:47.743924 7887 7887 E .oplus.crashbox: Not starting debugger since process cannot load the jdwp agent. 09-15 15:35:47.849926 2026 7711 D ResourcesManagerCache: For package com.oplus.crashbox we got cacheList [null] appInfoExt is null ? false hasFeature ? false 09-15 15:35:48.087540 7887 7887 I .oplus.crashbox: Could not load runtime generated app image: Boot image checksum mismatch (0xfc370e0c != 0x66e83b18) in image /data/user/0/com.oplus.crashbox/cache/oat_primary/arm64/CrashBox.art 09-15 15:35:48.088136 7887 7887 D nativeloader: Configuring clns-shared-7 for other apk /system_ext/app/CrashBox/CrashBox.apk. target_sdk_version=35, uses_libraries=, library_path=/system_ext/app/CrashBox/lib/arm64:/system_ext/app/CrashBox/CrashBox.apk!/lib/arm64-v8a:/system/lib64:/system_ext/lib64, permitted_path=/data:/mnt/expand:/data/user/0/com.oplus.crashbox:/system_ext/app/CrashBox:/system/lib64:/system_ext/lib64 09-15 15:35:48.337251 7667 7667 D LogKit.OLC_CrashBox_ThreadPoolUtil: java.util.concurrent.ThreadPoolExecutor@1fcbaff[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0] 09-15 15:35:48.337844 7667 7667 D LogKit.OLC_CrashBox_CrashBoxAppState: Start initialize CrashBoxAppState 09-15 15:35:48.521177 7667 7667 D LogKit.OLC_CrashBox_ThreadPoolUtil: java.util.concurrent.ThreadPoolExecutor@1fcbaff[Running, pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0] 09-15 15:35:48.521436 7667 7667 D LogKit.OLC_CrashBox_RemoteTaskDispatcher: startTaskObserver taskentity data 09-15 15:35:48.522142 7667 7667 D LogKit.OLC_CrashBox_FileUploadDispatcher: startObserver file collection data 09-15 15:35:48.847459 7667 7667 D LogKit.OLC_CrashBox_CrashMonitorService: onCreate 09-15 15:35:48.891726 7667 8024 D LogKit.OLC_CrashBox_FileDatabaseAligner: Delete those log file entity that without relative file! [{"fileId":"f9fc56d9-f138-4cf7-be90-4e5a6191b5c7","filePath":"/data/persist_log/olc/com.oplus.crashbox/anr_crash/java_crash@f9fc56d9-f138-4cf7-be90-4e5a6191b5c7@RMX3660_11.F.27_2270_202507191948@2025-09-04_07-29-01.zip","logType":"anr_crash","pkgNameAndVersion":"[{\"packageName\":\"com.oplus.camera\",\"versionCode\":40028,\"versionName\":\"5.020.847\"}]","timeStampMills":1756951138459},{"fileId":"36b5d2ba-8aed-4099-b334-26759882e809","filePath":"/data/persist_log/olc/com.oplus.crashbox/anr_crash/anr@36b5d2ba-8aed-4099-b334-26759882e809@RMX3660_11.F.27_2270_202507191948@2025-09-04_21-26-44.zip","logType":"anr_crash","pkgNameAndVersion":"[{\"packageName\":\"com.mventus.selfcare.activity\",\"versionCode\":1826,\"versionName\":\"10.19.0\"}]","timeStampMills":1757001394032},{"fileId":"5a7597e8-3bf3-4ece-ac9c-2b7fd81ff059","filePath":"/data/persist_log/olc/com.oplus.crashbox/anr_crash/anr@5a7597e8-3bf3-4ece-ac9c-2b7fd81ff059@RMX3660_11.F.27_2270_202507191948@2025-09-07_14-07-40.zip","logType":"anr_crash","pkgNameAndVersion":"[{\"packageName\":\"com.mventus.selfcare.activity\",\"versionCode\":1826,\"versionName\":\"10.19.0\"}]","timeStampMills":1757234253376}] 09-15 15:35:48.897460 7887 7887 I SwitchesProvider: com.oplus.crashbox.settingslib.switch_provider 09-15 15:35:48.897615 7887 7887 E CrashBox_SwitchProvider: createSwitchControllers called. 09-15 15:35:48.929444 8000 8072 D nativeloader: Load /data/app/~~NNfsbzmyUjKf0a4eZdBBjg==/com.google.android.googlequicksearchbox-RU2CLuzgHZvCjHPEt0gevQ==/base.apk!/lib/arm64-v8a/libnative_crash_handler_jni.so using class loader ns clns-7 (caller=/data/app/~~NNfsbzmyUjKf0a4eZdBBjg==/com.google.android.googlequicksearchbox-RU2CLuzgHZvCjHPEt0gevQ==/base.apk!classes2.dex): ok 09-15 15:35:48.990394 7590 8142 D nativeloader: Load /data/app/~~NNfsbzmyUjKf0a4eZdBBjg==/com.google.android.googlequicksearchbox-RU2CLuzgHZvCjHPEt0gevQ==/base.apk!/lib/arm64-v8a/libnative_crash_handler_jni.so using class loader ns clns-7 (caller=/data/app/~~NNfsbzmyUjKf0a4eZdBBjg==/com.google.android.googlequicksearchbox-RU2CLuzgHZvCjHPEt0gevQ==/base.apk!classes2.dex): ok 09-15 15:35:49.649258 7887 7887 W CrashBox_ProfileUtils: Failed to read anr ext profile, use the default profile. 09-15 15:35:50.627121 7667 7667 D LogKit.OLC_CrashBox_CrashBoxJobService: scheduleJob, jobId = 65568 ,repeatInterval = 7200000 09-15 15:35:50.648714 7667 7667 D LogKit.JobServiceUtil: CrashBoxJobService-65568 work delay 7200000 and max delay 10800000 09-15 15:35:50.648833 7667 7667 D LogKit.OLC_CrashBox_FileUploadDispatcher: Trigger the periodically upload work! jobId:65568, repeatInterval=7200000 09-15 15:35:50.648875 7667 7667 D LogKit.OLC_CrashBox_CrashBoxJobService: scheduleJob, jobId = 65584 ,repeatInterval = 7200000 09-15 15:35:50.651308 7667 7667 D LogKit.JobServiceUtil: CrashBoxJobService-65584 work delay 7200000 and max delay 10800000 09-15 15:35:50.651398 7667 7667 D LogKit.OLC_CrashBox_FileUploadDispatcher: Trigger the periodically upload work! jobId:65584, repeatInterval=7200000 09-15 15:35:50.651455 7667 7667 D LogKit.OLC_CrashBox_UploadCycleWorker: schedulePeriodicTaskForUploadCycle 09-15 15:35:50.651472 7667 7667 D LogKit.OLC_CrashBox_UploadCycleWorker: schedulePeriodicTaskForUploadCycle 09-15 15:35:50.651496 7667 7667 D LogKit.OLC_CrashBox_CrashBoxJobService: scheduleJob, jobId = 65600 ,repeatInterval = 86400000 09-15 15:35:50.652907 7667 7667 D LogKit.JobServiceUtil: CrashBoxJobService-65600 work delay 86400000 and max delay 129600000 09-15 15:35:50.700977 7887 8336 W CrashBox_FileUtils: failed to get Info: exists=false, canRead=false 09-15 15:35:50.712038 2026 6980 D OplusAnrCrashMonitor: handleServiceCall: bundle data 09-15 15:35:50.715448 2026 6980 D OplusAnrCrashMonitor: handleServiceCall: data memory 09-15 15:35:50.715604 2026 6980 D OplusAnrCrashMonitor: handleServiceCall: monitorVersin is 1, ignore data memory Data 09-15 15:35:50.986314 7887 8336 W CrashBox_TestModeManager: PackageName not found:com.oplus.autotest.qetest 09-15 15:35:51.110256 7667 8055 D LogKit.CrashBoxTaskManager: collectLog called, businessName = anr_crash 09-15 15:35:51.110351 7667 8055 D LogKit.OLC_CrashBox_DataCollector: CrashBox accepted the exception Bundledata! 09-15 15:35:51.110497 7667 8055 D LogKit.OLC_CrashBox_ThreadPoolUtil: java.util.concurrent.ThreadPoolExecutor@1fcbaff[Running, pool size = 2, active threads = 0, queued tasks = 0, completed tasks = 2] 09-15 15:35:51.110811 7887 8336 W CrashBox_ExceptionInfoManager: open db report no limit .... 09-15 15:35:51.111037 7667 8024 D LogKit.OLC_CrashBox_AnrCrashCollector: Begin collect Bundle! evType = 1002;logCollectType = 8575 09-15 15:35:51.111512 7667 8024 D LogKit.OLC_CrashBox_DcsStatsUtil: Log upload status is Exception caught successfully. 09-15 15:35:51.111512 7667 8024 D LogKit.OLC_CrashBox_DcsStatsUtil: FileUploadCycleEntity{ 09-15 15:35:51.111512 7667 8024 D LogKit.OLC_CrashBox_DcsStatsUtil: fileId = ef7ea072-fa86-4b66-8dac-7e2aaea2df19; 09-15 15:35:51.111512 7667 8024 D LogKit.OLC_CrashBox_DcsStatsUtil: status = 10000; 09-15 15:35:51.111512 7667 8024 D LogKit.OLC_CrashBox_DcsStatsUtil: businessId = 23; 09-15 15:35:51.111512 7667 8024 D LogKit.OLC_CrashBox_DcsStatsUtil: taskId = ; 09-15 15:35:51.111512 7667 8024 D LogKit.OLC_CrashBox_DcsStatsUtil: timeStamp =1757930751111; 09-15 15:35:51.111512 7667 8024 D LogKit.OLC_CrashBox_DcsStatsUtil: createTime =-1; 09-15 15:35:51.111512 7667 8024 D LogKit.OLC_CrashBox_DcsStatsUtil: } 09-15 15:35:51.114303 7667 8024 I LogKit.OLC_CrashBox_ExceptionInfoEntity: exceptionInfoCollector get type:crash 09-15 15:35:51.114509 7667 8024 I LogKit.OLC_CrashBox_ExceptionInfoEntity: exceptionInfoCollector get componentName:java.lang.IllegalArgumentException 09-15 15:35:51.115039 7667 8024 D LogKit.OLC_CrashBox_PackageUtils: PackageName: com.android.bluetooth 09-15 15:35:51.124140 7667 8024 D LogKit.OLC_CrashBox_PackageUtils: PackageName: com.android.bluetooth 09-15 15:35:51.131526 7667 8024 D LogKit.OLC_CrashBox_FileUtils: success to chmod path /data/persist_log/olc/com.oplus.crashbox/apk_logs, success code: 0 09-15 15:35:51.131589 7667 8024 D LogKit.OLC_CrashBox_CrashBoxLogHelper: start to get extrasInfo Log 09-15 15:35:51.131905 7667 8024 D LogKit.OLC_CrashBox_ThreadPoolUtil: java.util.concurrent.ThreadPoolExecutor@1fcbaff[Running, pool size = 2, active threads = 1, queued tasks = 0, completed tasks = 2] 09-15 15:35:51.132002 7667 8024 D LogKit.OLC_CrashBox_CrashBoxLogHelper: start to get anr crash dump info 09-15 15:35:51.132179 7667 8047 D LogKit.ExtraRunnable: start collect extra info log to /data/persist_log/olc/com.oplus.crashbox/apk_logs/extras@2025-09-15_15-35-51.txt 09-15 15:35:51.139889 7667 8024 D LogKit.OLC_CrashBox_ThreadPoolUtil: java.util.concurrent.ThreadPoolExecutor@1fcbaff[Running, pool size = 2, active threads = 2, queued tasks = 0, completed tasks = 2] 09-15 15:35:51.168500 8080 8434 D nativeloader: Load /data/app/~~HyYADIJVuNoH4HwqBqLzhg==/com.google.android.keep-v6wRqa0gMI_HkQnfW6wcYQ==/lib/arm64/libnative_crash_handler_jni.so using class loader ns clns-7 (caller=/data/app/~~HyYADIJVuNoH4HwqBqLzhg==/com.google.android.keep-v6wRqa0gMI_HkQnfW6wcYQ==/base.apk): ok 09-15 15:35:51.195917 7667 8024 D LogKit.OLC_CrashBox_AnrCrashFileCollector: send collectLog command 09-15 15:35:51.201007 7667 8024 D gaia-GaiaSendManager: send: 269500417, eventTag = crashbox_collect_log 09-15 15:35:51.227304 7667 8047 D LogKit.OLC_CrashBox_PackageUtils: PackageName: com.android.bluetooth 09-15 15:35:51.265681 7667 8471 D LogKit.OLC_CrashBox_ThreadPoolUtil: java.util.concurrent.ThreadPoolExecutor@1fcbaff[Running, pool size = 3, active threads = 3, queued tasks = 0, completed tasks = 2] 09-15 15:35:51.294682 7667 8047 D LogKit.OLC_CrashBox_PackageUtils: PackageName: com.android.bluetooth 09-15 15:35:51.306167 7667 8047 D LogKit.OLC_CrashBox_FileUtils: success to chmod path /data/persist_log/olc/com.oplus.crashbox/apk_logs/extras@2025-09-15_15-35-51.txt, success code: 0 09-15 15:35:51.311659 7667 8509 D LogKit.DropBoxRunnable: start collect drop box log to /data/persist_log/olc/com.oplus.crashbox/apk_logs 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: The log switch is turned on, but the conditions are not met. exceptionInfo = ExceptionInfo{appInfoList=[AppInfo{packageName='com.android.bluetooth', processName='com.android.bluetooth', appName='Bluetooth', versionName='15.0.0', versionCode=35, componentName='java.lang.IllegalArgumentException', isForeground=false}], crashInfo=CrashInfo{exceptionClassName='java.lang.IllegalArgumentException', message='Receiver not registered: com.oplus.bluetooth.feature.dcs.OplusBluetoothRecorderFactory$1@a313ee4', stackTrace='java.lang.IllegalArgumentException: Receiver not registered: com.oplus.bluetooth.feature.dcs.OplusBluetoothRecorderFactory$1@a313ee4 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:1777) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1922) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:832) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.oplus.bluetooth.feature.dcs.OplusBluetoothRecorderFactory.cleanUp(OplusBluetoothRecorderFactory.java:312) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.oplus.bluetooth.feature.OplusBluetoothFeatureWrapper.deInit(OplusBluetoothFeatureWrapper.java:247) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.oplus.bluetooth.btservice.OplusAdapterServiceExtImpl.oplusCleanup(OplusAdapterServiceExtImpl.java:580) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.bluetooth.btservice.AdapterService.cleanup(AdapterService.java:1564) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.bluetooth.btservice.AdapterState$OffState.enter(AdapterState.java:203) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.internal.util.StateMachine$SmHandler.invokeEnterMethods(StateMachine.java:1042) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.internal.util.StateMachine$SmHandler.performTransitions(StateMachine.java:888) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.internal.util.StateMachine$SmHandler.handleMessage(StateMachine.java:828) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.os.Handler.dispatchMessage(Handler.java:107) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.os.Looper.loopOnce(Looper.java:282) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.os.Looper.loop(Looper.java:387) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at android.app.ActivityThread.main(ActivityThread.java:9500) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at java.lang.reflect.Method.invoke(Native Method) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1005) 09-15 15:35:51.313987 7667 8471 D LogKit.AnrCrashDumpRunnable: '}, anrInfo=null, eventType='java_crash', time=1757930727413, timeZone='GMT+05:30', count=1, fileId='ef7ea072-fa86-4b66-8dac-7e2aaea2df19', filePath='null', fileDir='null'} 09-15 15:35:51.345748 2399 2575 D gaia:event_server: [handleEvent:34]parse event from rawMsg: {"data":"{\"app_list\":[\"com.android.bluetooth\"],\"error_time\":1757930727413,\"error_type\":\"java_crash\",\"file_id\":\"ef7ea072-fa86-4b66-8dac-7e2aaea2df19\",\"log_option\":8575,\"log_list\":[\"extras@2025-09-15_15-35-51.txt\",\"java_crash@2025-09-15_15-35-27.txt\"]}","eventId":269500417,"packetId":"1001","type":2} 09-15 15:35:51.351299 2399 2495 D gaia:logcollect: [startCatchLog:131]LogCollect startCatchLog with exception Info: {"app_list":["com.android.bluetooth"],"error_time":1757930727413,"error_type":"java_crash","file_id":"ef7ea072-fa86-4b66-8dac-7e2aaea2df19","log_option":8575,"log_list":["extras@2025-09-15_15-35-51.txt","java_crash@2025-09-15_15-35-27.txt"]} 09-15 15:35:51.413179 2399 2495 D gaia:logcollect: [startCatchLog:173]collect for temp dir of: /data/persist_log/olc/com.oplus.crashbox/temp_1 09-15 15:35:51.485703 2399 8595 D gaia:crashlogtask: [collect:31]CrashLogTask collect 09-15 15:35:51.498023 2399 8596 D gaia:anrcrashdumptask: [collect:31]AnrCrashDumpTask collect 09-15 15:35:51.498174 2399 8596 D gaia:anrcrashdumptask: [collect:49]target anr crash dump file name is: java_crash@2025-09-15_15-35-27.txt 09-15 15:35:51.580029 7724 8402 I FirebaseCrashlytics: Initializing Firebase Crashlytics 18.3.5 for com.coloros.assistantscreen 09-15 15:35:52.132875 7724 8637 V DynamiteModule: Dynamite loader version >= 2, using loadModule2NoCrashUtils 09-15 15:35:52.793843 8334 8334 I FirebaseCrashlytics: Initializing Firebase Crashlytics 18.2.4 for com.oplus.games 09-15 15:35:52.969292 8334 8807 V DynamiteModule: Dynamite loader version >= 2, using loadModule2NoCrashUtils 09-15 15:35:54.494466 8288 9068 D nativeloader: Load /data/app/~~Fo-65HhuwbIg6dmeFl_bHQ==/com.google.android.apps.docs-WbG-cHu100IGxTZ1vNl3fA==/split_config.arm64_v8a.apk!/lib/arm64-v8a/libnative_crash_handler_jni.so using class loader ns clns-7 (caller=/data/app/~~Fo-65HhuwbIg6dmeFl_bHQ==/com.google.android.apps.docs-WbG-cHu100IGxTZ1vNl3fA==/base.apk!classes2.dex): ok 09-15 15:35:54.791850 8243 9082 D nativeloader: Load /data/app/~~49Cw_5APkgFZaj1_fp-ZIA==/com.google.android.calendar-lPx_nfifcRPxy6mwTOssWg==/split_config.arm64_v8a.apk!/lib/arm64-v8a/libnative_crash_handler_jni.so using class loader ns clns-7 (caller=/data/app/~~49Cw_5APkgFZaj1_fp-ZIA==/com.google.android.calendar-lPx_nfifcRPxy6mwTOssWg==/base.apk!classes2.dex): ok 根据日志分析问题处在哪里
最新发布
09-27
在分析包含 CrashBox、蓝牙模块等相关日志中出现的 `Receiver not registered` 异常原因时,以下是可能的情况: #### 代码逻辑问题 - **重复注销**:在代码里,如果广播接收器被注销后又尝试再次注销,就会抛出 `Receiver not registered` 异常。例如,在一个 Activity 的 `onDestroy` 方法中注销了广播接收器,然而在某个按钮的点击事件里又进行了一次注销操作。 ```java @Override protected void onDestroy() { super.onDestroy(); if (myReceiver != null) { unregisterReceiver(myReceiver); } } public void onButtonClick() { if (myReceiver != null) { unregisterReceiver(myReceiver); // 可能会导致 Receiver not registered 异常 } } ``` - **提前注销**:在广播接收器还未注册时就尝试进行注销操作,也会引发该异常。比如在初始化广播接收器之前就调用了注销方法。 ```java // 未注册广播接收器就尝试注销 unregisterReceiver(myReceiver); ``` #### 生命周期管理问题 - **Activity 或 Fragment 生命周期**:在 Android 中,Activity 或者 Fragment 的生命周期管理不当会造成广播接收器在不恰当的时机被注销。例如,在 Activity 的 `onPause` 方法中注销了广播接收器,但是在 `onResume` 方法里却没有重新注册,当 Activity 再次进入前台时就可能会出现问题。 ```java @Override protected void onPause() { super.onPause(); if (myReceiver != null) { unregisterReceiver(myReceiver); } } @Override protected void onResume() { super.onResume(); // 没有重新注册广播接收器 } ``` #### 多线程问题 - **并发操作**:在多线程环境下,对广播接收器的注册和注销操作可能会同时进行,从而引发 `Receiver not registered` 异常。例如,一个线程正在注册广播接收器,而另一个线程却在注销它。 ```java // 线程 1 new Thread(new Runnable() { @Override public void run() { registerReceiver(myReceiver, new IntentFilter("ACTION")); } }).start(); // 线程 2 new Thread(new Runnable() { @Override public void run() { unregisterReceiver(myReceiver); } }).start(); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值