Main Thread Checker: UI API called on a background thread

本文讨论了在iOS开发过程中遇到的主线程警告问题,并提供了修复代码的方法。通过在关键操作中引入dispatch_async(dispatch_get_main_queue(),^{}

在开发的过程中遇到一个警告问题,如下:

Main Thread Checker: UI API called on a background thread: -[UIWebView loadRequest:]
PID: 18274, TID: 1210667, Thread name: (none), Queue name: com.apple.root.default-qos, QoS: 21
Backtrace:
4   quickofficeOA                       0x0000000106486af4 __40-[approveLookViewController viewDidLoad]_block_invoke.99 + 356
5   libdispatch.dylib                   0x00000001123c07ab _dispatch_call_block_and_release + 12
6   libdispatch.dylib                   0x00000001123c17ec _dispatch_client_callout + 8
7   libdispatch.dylib                   0x00000001123c6619 _dispatch_queue_override_invoke + 1451
8   libdispatch.dylib                   0x00000001123cd36c _dispatch_root_queue_drain + 664
9   libdispatch.dylib                   0x00000001123cd076 _dispatch_worker_thread3 + 132
10  libsystem_pthread.dylib             0x00000001128ec169 _pthread_wqthread + 1387
11  libsystem_pthread.dylib             0x00000001128ebbe9 start_wqthread + 13

出现警告的代码:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSString*body = [selfexamineTheFilePathStr:_path];

        if(body) {

            body = [bodystringByReplacingOccurrencesOfString:@"\n" withString:@"

"];

            [_webViewloadHTMLString:bodybaseURL:nil];

        }else{

            NSURLRequest*request = [NSURLRequestrequestWithURL:[NSURLfileURLWithPath:_path]];

            [_webViewloadRequest:request];

        }

    });

修复后的代码:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSString*body = [self examineTheFilePathStr:_path];

        if (body)  {

            body = [bodystringByReplacingOccurrencesOfString:@"\n" withString:@"
"];

            [_webViewloadHTMLString:bodybaseURL:nil];

        } else {

            NSURLRequest*request = [NSURLRequestrequestWithURL:[NSURLfileURLWithPath:_path]];

            dispatch_async(dispatch_get_main_queue(), ^{

                [_webViewloadRequest:request];

            });

        }

    });

加上 dispatch_async(dispatch_get_main_queue(), ^{ }); 后就解决了。

private Watchdog() { 511 mThread = new Thread(this::run, "watchdog"); 512 513 // Initialize handler checkers for each common thread we want to check. Note 514 // that we are not currently checking the background thread, since it can 515 // potentially hold longer running operations with no guarantees about the timeliness 516 // of operations there. 517 // 518 // Use a custom thread to check monitors to avoid lock contention from impacted other 519 // threads. 520 ServiceThread t = new ServiceThread("watchdog.monitor", 521 android.os.Process.THREAD_PRIORITY_DEFAULT, true /*allowIo*/); 522 t.start(); 523 mMonitorChecker = new HandlerChecker(new Handler(t.getLooper()), "monitor thread", mLock); 524 mHandlerCheckers.add(withDefaultTimeout(mMonitorChecker)); 525 526 mHandlerCheckers.add( 527 withDefaultTimeout( 528 new HandlerChecker(FgThread.getHandler(), "foreground thread", mLock))); 529 // Add checker for main thread. We only do a quick check since there 530 // can be UI running on the thread. 531 mHandlerCheckers.add( 532 withDefaultTimeout( 533 new HandlerChecker( 534 new Handler(Looper.getMainLooper()), "main thread", mLock))); 535 // Add checker for shared UI thread. 536 mHandlerCheckers.add( 537 withDefaultTimeout(new HandlerChecker(UiThread.getHandler(), "ui thread", mLock))); 538 // And also check IO thread. 539 mHandlerCheckers.add( 540 withDefaultTimeout(new HandlerChecker(IoThread.getHandler(), "i/o thread", mLock))); 541 // And the display thread. 542 mHandlerCheckers.add( 543 withDefaultTimeout( 544 new HandlerChecker(DisplayThread.getHandler(), "display thread", mLock))); 545 // And the animation thread. 546 mHandlerCheckers.add( 547 withDefaultTimeout( 548 new HandlerChecker( 549 AnimationThread.getHandler(), "animation thread", mLock))); 550 // And the surface animation thread. 551 mHandlerCheckers.add( 552 withDefaultTimeout( 553 new HandlerChecker( 554 SurfaceAnimationThread.getHandler(), 555 "surface animation thread", 556 mLock))); 557 // Initialize monitor for Binder threads. 558 addMonitor(new BinderThreadMonitor()); 559 560 mInterestingJavaPids.add(Process.myPid()); 561 562 //#ifdef OPLUS_EXTENSION_HOOK 563 //Runsheng.Pei@ANDROID.STABILITY, 2020/02/08, Add for decouple: 564 //Jianqing.Wu@ANDROID.ARCH, 2021-08-25 : create ocsi object 565 mWdtExt = ExtLoader.type(IWatchdogExt.class).base(this).create(); 566 //#endif /*OPLUS_EXTENSION_HOOK*/ 567 568 // See the notes on DEFAULT_TIMEOUT. 569 assert DB || Build.IS_USERDEBUG || 570 DEFAULT_TIMEOUT > ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS; 571 572 //#ifdef MTK_ONLY_FEATURE_AEE 573 mWdtSocExt.getExceptionLog(); 574 //#endif /* MTK_ONLY_FEATURE_AEE */ 575 mTraceErrorLogger = new TraceErrorLogger(); 576 } 577 578 /** 579 * Called by SystemServer to cause the internal thread to begin execution. 580 */ 581 public void start() { 582 //#ifdef OPLUS_EXTENSION_HOOK 583 //#Daibo.Le@ANDROID.STABILITY, 2023/03/16, add for closing watchdog in hwasan or hightempaging build 584 if (mWdtExt.checkIfNeedCloseWdt()) { 585 return; 586 } 587 //#endif /*OPLUS_EXTENSION_HOOK*/ 588 mThread.start(); 589 }这是watchdog的构造函数请帮我解释一下代码的作用
最新发布
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值