热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android之Monkey源码分析(第x篇:App崩溃线程堆栈的简单分析)

前言本文所有线程堆栈来源于Monkey的标准错误流中提取,涉及的线程堆栈全部包含代码混淆加密,另外本文中提及到的应用包名为虚构,请勿对号入

前言

    本文所有线程堆栈来源于Monkey的标准错误流中提取,涉及的线程堆栈全部包含代码混淆加密,另外本文中提及到的应用包名为虚构,请勿对号入座


Resource$NotFoundException

// CRASH: com.cmcm.shorts (pid 7002)
// Short Msg: android.content.res.Resources$NotFoundException
// Long Msg: android.content.res.Resources$NotFoundException: String resource ID #0x7f0f0602
// Build Label: OPPO/PACM00/PACM00:8.1.0/O11019/1527000058:user/release-keys
// Build Changelist: 1529729031
// Build Time: 1529729031000
// android.content.res.Resources$NotFoundException: String resource ID #0x7f0f0602
// at android.content.res.Resources.getText(Resources.java:380)
// at android.content.res.Resources.getString(Resources.java:474)
// at android.content.Context.getString(Context.java:562)
// at com.cmcm.syncfriends.InviteFriendsAdapter.b(InviteFriendsAdapter.java:6247)
// at com.cmcm.syncfriends.InviteFriendsAdapter$3.onClick(InviteFriendsAdapter.java:107)
// at android.view.View.performClick(View.java:6387)
// at android.view.View$PerformClick.run(View.java:25217)
// at android.os.Handler.handleCallback(Handler.java:790)
// at android.os.Handler.dispatchMessage(Handler.java:99)
// at android.os.Looper.loop(Looper.java:183)
// at android.app.ActivityThread.main(ActivityThread.java:7014)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:514)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)

    当从资源文件中无法读取到内存中时,就会看到Resource$NotFoundException对象,这个NotFoundException类书写在Resource类下面,是一个静态内部类,所以中间有个美元符号分隔开

类型:CRASH

进程名:com.cmcm.shorts 

进程id:7002

短信息:android.content.res.Resource$NotFoundException

长信息:省略重复的,resource ID ,String类型的找不到,通过资源id获取1个String

构建标签:oppo、设备名称、系统版本,签名类型:用户/release-keys

构建改变List:1529729031

构建时间:也是一个时间戳

异常名称:Resource&NotFoundException

异常描述:String resource ID #0x7f0f0602

通过resource的id,根本找不到resource文件


IllegalStateException

// CRASH: com.cmcm.shorts (pid 14660)
// Short Msg: java.lang.IllegalStateException
// Long Msg: java.lang.IllegalStateException: View com.color.internal.widget.ColorToastLayout{19da0e5 V.E...... ......I. 0,0-0,0 #c0204f9 oppo:id/color_toast_layout} has already been added to the window manager.
// Build Label: OPPO/PACM00/PACM00:8.1.0/O11019/1527000058:user/release-keys
// Build Changelist: 1529729031
// Build Time: 1529729031000
// java.lang.IllegalStateException: View com.color.internal.widget.ColorToastLayout{19da0e5 V.E...... ......I. 0,0-0,0 #c0204f9 oppo:id/color_toast_layout} has already been added to the window manager.
// at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:340)
// at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
// at android.widget.Toast$TN.handleShow(Toast.java:527)
// at android.widget.Toast$TN$1.handleMessage(Toast.java:420)
// at android.os.Handler.dispatchMessage(Handler.java:106)
// at android.os.Looper.loop(Looper.java:183)
// at android.app.ActivityThread.main(ActivityThread.java:7014)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:514)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)

RuntimeException

// CRASH: com.cmcm.shorts (pid 7491)
// Short Msg: java.lang.RuntimeException
// Long Msg: java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@b0ce46e
// Build Label: OPPO/PACM00/PACM00:8.1.0/O11019/1527000058:user/release-keys
// Build Changelist: 1529729031
// Build Time: 1529729031000
// java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@b0ce46e
// at android.graphics.BaseCanvas.throwIfCannotDraw(BaseCanvas.java:55)
// at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:230)
// at android.view.RecordingCanvas.drawBitmap(RecordingCanvas.java:97)
// at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:529)
// at android.widget.ImageView.onDraw(ImageView.java:1349)
// at android.view.View.draw(View.java:19514)
// at android.view.View.updateDisplayListIfDirty(View.java:18431)
// at android.view.View.draw(View.java:19229)
// at android.view.ViewGroup.drawChild(ViewGroup.java:4350)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4136)
// at android.view.View.updateDisplayListIfDirty(View.java:18422)
// at android.view.View.draw(View.java:19229)
// at android.view.ViewGroup.drawChild(ViewGroup.java:4350)
// at android.support.design.widget.CollapsingToolbarLayout.drawChild(CollapsingToolbarLayout.java:324)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4136)
// at android.view.View.draw(View.java:19522)
// at android.support.design.widget.CollapsingToolbarLayout.draw(CollapsingToolbarLayout.java:286)
// at android.view.View.updateDisplayListIfDirty(View.java:18431)
// at android.view.View.draw(View.java:19229)
// at android.view.ViewGroup.drawChild(ViewGroup.java:4350)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4136)
// at android.view.View.draw(View.java:19522)
// at android.view.View.updateDisplayListIfDirty(View.java:18431)
// at android.view.View.draw(View.java:19229)
// at android.view.ViewGroup.drawChild(ViewGroup.java:4350)
// at android.support.design.widget.CoordinatorLayout.drawChild(CoordinatorLayout.java:1254)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4136)
// at android.view.View.updateDisplayListIfDirty(View.java:18422)
// at android.view.View.draw(View.java:19229)
// at android.view.ViewGroup.drawChild(ViewGroup.java:4350)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4136)
// at android.view.View.draw(View.java:19522)
// at android.view.View.updateDisplayListIfDirty(View.java:18431)
// at android.view.View.draw(View.java:19229)
// at android.view.ViewGroup.drawChild(ViewGroup.java:4350)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4136)
// at android.view.View.updateDisplayListIfDirty(View.java:18422)
// at android.view.View.draw(View.java:19229)
// at android.view.ViewGroup.drawChild(ViewGroup.java:4350)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4136)
// at android.view.View.updateDisplayListIfDirty(View.java:18422)
// at android.view.View.draw(View.java:19229)
// at android.view.ViewGroup.drawChild(ViewGroup.java:4350)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4136)
// at android.view.View.updateDisplayListIfDirty(View.java:18422)
// at android.view.View.draw(View.java:19229)
// at android.view.ViewGroup.drawChild(ViewGroup.java:4350)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4136)
// at android.view.View.updateDisplayListIfDirty(View.java:18422)
// at android.view.View.draw(View.java:19229)
// at android.view.ViewGroup.drawChild(ViewGroup.java:4350)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4136)
// at android.view.View.draw(View.java:19522)
// at com.android.internal.policy.DecorView.draw(DecorView.java:845)
// at android.view.View.updateDisplayListIfDirty(View.java:18431)
// at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:669)
// at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:675)
// at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:783)
// at android.view.ViewRootImpl.draw(ViewRootImpl.java:3472)
// at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3262)
// at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2757)
// at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1650)
// at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7579)
// at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
// at android.view.Choreographer.doCallbacks(Choreographer.java:732)
// at android.view.Choreographer.doFrame(Choreographer.java:664)
// at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
// at android.os.Handler.handleCallback(Handler.java:790)
// at android.os.Handler.dispatchMessage(Handler.java:99)
// at android.os.Looper.loop(Looper.java:183)
// at android.app.ActivityThread.main(ActivityThread.java:7014)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:514)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)


OutOfMemoryError

// CRASH: com.cmcm.shorts (pid 15503)
// Short Msg: java.lang.OutOfMemoryError
// Long Msg: java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
// Build Label: OPPO/PACM00/PACM00:8.1.0/O11019/1527000058:user/release-keys
// Build Changelist: 1529729031
// Build Time: 1529729031000
// java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
// at java.lang.Thread.nativeCreate(Native Method)
// at java.lang.Thread.start(Thread.java:733)
// at com.ksy.recordlib.service.model.processor.Mp4InputProcessor.onStop(Mp4InputProcessor.java:1808)
// at com.ksy.recordlib.service.model.processor.BaseProcessor.stop(BaseProcessor.java:45)
// at com.ksy.recordlib.service.model.processor.GenerateScreenShots.release(GenerateScreenShots.java:277)
// at com.ksy.recordlib.service.model.processor.GenerateScreenShots.generateScreenshotsFinish(GenerateScreenShots.java:267)
// at com.ksy.recordlib.service.model.processor.GenerateScreenShots.access$400(GenerateScreenShots.java:23)
// at com.ksy.recordlib.service.model.processor.GenerateScreenShots$3.onProcessorError(GenerateScreenShots.java:239)
// at com.ksy.recordlib.service.model.processor.Mp4InputProcessor$2.run(Mp4InputProcessor.java:1520)
// at java.lang.Thread.run(Thread.java:764)

堆内存空间不足时,会抛出该异常,GC程序已经不能再帮你了


IndexOutOfBoundsException

// CRASH: com.cmcm.shorts (pid 22934)
// Short Msg: java.lang.IndexOutOfBoundsException
// Long Msg: java.lang.IndexOutOfBoundsException: setSpan (-1 ... -1) starts before 0
// Build Label: samsung/c7proltezh/c7proltechn:7.0/NRD90M/C7010ZHU1BRE4:user/release-keys
// Build Changelist: C7010ZHU1BRE4
// Build Time: 1526978811000
// java.lang.IndexOutOfBoundsException: setSpan (-1 ... -1) starts before 0
// at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1270)
// at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:684)
// at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:677)
// at android.text.Selection.setSelection(Selection.java:76)
// at android.text.method.ArrowKeyMovementMethod.onTouchEvent(ArrowKeyMovementMethod.java:284)
// at android.widget.TextView.onTouchEvent(TextView.java:10123)
// at android.view.View.dispatchTouchEvent(View.java:10779)
// at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
// at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
// at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
// at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
// at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
// at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
// at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
// at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
// at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
// at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
// at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
// at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
// at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:605)
// at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1895)
// at android.app.Dialog.dispatchTouchEvent(Dialog.java:894)
// at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:567)
// at android.view.View.dispatchPointerEvent(View.java:11008)
// at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5155)
// at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5007)
// at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4532)
// at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4585)
// at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4551)
// at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4684)
// at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4559)
// at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4741)
// at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4532)
// at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4585)
// at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4551)
// at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4559)
// at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4532)
// at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7092)
// at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7024)
// at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6985)
// at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7202)
// at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
// at android.os.MessageQueue.nativePollOnce(Native Method)
// at android.os.MessageQueue.next(MessageQueue.java:323)
// at android.os.Looper.loop(Looper.java:136)
// at android.app.ActivityThread.main(ActivityThread.java:6776)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

数组的最小下标是0,这个异常对象用于提示数组下标小于0,或者超过当前数组最后一个元素的下标


OutOfMemoryError

// CRASH: com.cmcm.shorts (pid 30606)
// Short Msg: java.lang.OutOfMemoryError
// Long Msg: java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available
// Build Label: samsung/c7proltezh/c7proltechn:7.0/NRD90M/C7010ZHU1BRE4:user/release-keys
// Build Changelist: C7010ZHU1BRE4
// Build Time: 1526978811000
// java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available

没有stack trace available


IllegalStateException

// CRASH: com.cmcm.shorts (pid 32761)
// Short Msg: java.lang.IllegalStateException
// Long Msg: java.lang.IllegalStateException: titleLayoutWhite must not be null
// Build Label: OPPO/PACM00/PACM00:8.1.0/O11019/1527000058:user/release-keys
// Build Changelist: 1529729031
// Build Time: 1529729031000
// java.lang.IllegalStateException: titleLayoutWhite must not be null
// at com.cmcm.pullnew.fragment.DayTaskFragment.a(DayTaskFragment.kt:4199)
// at com.cmcm.pullnew.presenter.SignInPresenter$a.run(SignInPresenter.kt:43)
// at android.os.Handler.handleCallback(Handler.java:790)
// at android.os.Handler.dispatchMessage(Handler.java:99)
// at android.os.Looper.loop(Looper.java:183)
// at android.app.ActivityThread.main(ActivityThread.java:7014)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:514)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)

混淆包的缺点,方法名称都变了,不能定位到具体是哪一行代码 


IllegalArgumentException

// CRASH: com.crush.gogo (pid 390)
// Short Msg: java.lang.IllegalArgumentException
// Long Msg: java.lang.IllegalArgumentException: Failed to find configured root that contains /
// Build Label: HUAWEI/EML-AL00/HWEML:8.1.0/HUAWEIEML-AL00/109(SP5C00):user/release-keys
// Build Changelist: 109(SP5C00)
// Build Time: 1525893945000
// java.lang.IllegalArgumentException: Failed to find configured root that contains /
// at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:738)
// at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:417)
// at com.crush.gogo.utils.ShareUtil.shareImage(ShareUtil.kt:101)
// at com.crush.gogo.login.fragment.MyRatingFragment$initEvent$4.onClick(MyRatingFragment.kt:239)
// at android.view.View.performClick(View.java:6329)
// at android.view.View$PerformClick.run(View.java:25004)
// at android.os.Handler.handleCallback(Handler.java:809)
// at android.os.Handler.dispatchMessage(Handler.java:102)
// at android.os.Looper.loop(Looper.java:166)
// at android.app.ActivityThread.main(ActivityThread.java:7367)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)

应该用未混淆的debug包,继续跑Monkey?应该两个版本都跑就对了……


IndexOutOfBoundsException

// CRASH: com.crush.gogo (pid 1146)
// Short Msg: java.lang.IndexOutOfBoundsException
// Long Msg: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
// Build Label: HUAWEI/EML-AL00/HWEML:8.1.0/HUAWEIEML-AL00/109(SP5C00):user/release-keys
// Build Changelist: 109(SP5C00)
// Build Time: 1525893945000
// java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
// at java.util.LinkedList.checkElementIndex(LinkedList.java:555)
// at java.util.LinkedList.get(LinkedList.java:476)
// at com.crush.gogo.homecenter.fragment.MainCardFragment$initListener$6.onClick(MainCardFragment.kt:234)
// at android.view.View.performClick(View.java:6329)
// at android.view.View$PerformClick.run(View.java:25004)
// at android.os.Handler.handleCallback(Handler.java:809)
// at android.os.Handler.dispatchMessage(Handler.java:102)
// at android.os.Looper.loop(Looper.java:166)
// at android.app.ActivityThread.main(ActivityThread.java:7367)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)


推荐阅读
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 在基于.NET框架的分层架构实践中,为了实现各层之间的松散耦合,本文详细探讨了依赖注入(DI)和控制反转(IoC)容器的设计与实现。通过合理的依赖管理和对象创建,确保了各层之间的单向调用关系,从而提高了系统的可维护性和扩展性。此外,文章还介绍了几种常见的IoC容器实现方式及其应用场景,为开发者提供了实用的参考。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 本文详细介绍了如何在 Android 应用中获取系统的版本号,包括具体的应用场景和实现步骤。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • 《精通 jQuery》第六章:深入解析与实战应用
    《精通 jQuery》第六章:深入解析与实战应用本章详细探讨了 Ajax 技术的核心机制及其实际应用。Ajax 通过 XMLHttpRequest 对象实现客户端与服务器之间的异步数据交换,从而在不重新加载整个页面的情况下更新部分内容。这种技术不仅提升了用户体验,还提高了应用的响应速度和效率。此外,本章还介绍了如何利用 jQuery 简化 Ajax 操作,并提供了多个实战案例,帮助读者更好地理解和掌握这一重要技术。 ... [详细]
  • 在Python编程中,探讨了并发与并行的概念及其区别。并发指的是系统同时处理多个任务的能力,而并行则指在同一时间点上并行执行多个任务。文章详细解析了阻塞与非阻塞操作、同步与异步编程模型,以及IO多路复用技术的应用。通过模拟socket发送HTTP请求的过程,展示了如何创建连接、发送数据和接收响应,并强调了默认情况下socket的阻塞特性。此外,还介绍了如何利用这些技术优化网络通信性能和提高程序效率。 ... [详细]
author-avatar
手机用户2502878113
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有