Android开发异常和处理方案总结

1. BroadcastReceiver作为内部类时,如要通过静态注册的方式在清单文件中注册,必须要声明为public static,否则会报错:

Caused by: java.lang.RuntimeException: Unable to instantiate receiver com.hp.kimilauncher.MainActivity$LauncherControlerReceiver: java.lang.InstantiationException: java.lang.Class<com.hp.kimilauncher.MainActivity$LauncherControlerReceiver> has no zero argument constructor
            at android.app.ActivityThread.handleReceiver(ActivityThread.java:3103)
            at android.app.ActivityThread.-wrap18(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1628)
            at android.os.Handler.dispatchMessage(Handler.java:110)
            at android.os.Looper.loop(Looper.java:203)
            at android.app.ActivityThread.main(ActivityThread.java:6293)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
         Caused by: java.lang.InstantiationException: java.lang.Class<com.hp.kimilauncher.MainActivity$LauncherControlerReceiver> has no zero argument constructor
            at java.lang.Class.newInstance(Native Method)
            at android.app.ActivityThread.handleReceiver(ActivityThread.java:3098)
            at android.app.ActivityThread.-wrap18(ActivityThread.java) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1628) 
            at android.os.Handler.dispatchMessage(Handler.java:110) 
            at android.os.Looper.loop(Looper.java:203) 
            at android.app.ActivityThread.main(ActivityThread.java:6293) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945) 

总结:

  • BroadcastReceiver作为内部类时,如要通过静态注册的方式在清单文件中注册,必须要声明为public static,否则会报错

解决方案

  1. 声明为public static
  2. 在代码中动态注册

2. Dagger2 Component报错:

E:\ASWorkSpace\IntelligentXiaoK\daggerdemo\build\tmp\kapt3\stubs\debug\com\tdk\daggerdemo\AppComponent.java:26: 错误: @Component.Builder is missing setters for required modules or components: [com.tdk.daggerdemo.AppModule]
    public static abstract interface Builder {

错误代码:

    @Singleton
    @Component(modules = [AppModule::class])
    interface AppComponent {
    
        fun sharedPreferences(): SharedPreferences
    
        fun myApplication(): Context
    
        fun inject(application: MyApplication)
    
    
        @Component.Builder
        interface Builder {
    
            @BindsInstance
            fun application(application: MyApplication): Builder
    
            fun build(): AppComponent
    
        }
    }            

解释
@Component.Builder中缺乏需要配置的modulescomponents,以下是@Component.Builder源码中提供的案例,我们对比一下,就会发现错误代码没有配置modules,只要配置一下modules问题就解决了

    * @Component(modules = {BackendModule.class, FrontendModule.class})
    * interface MyComponent {
    *   MyWidget myWidget();
    *   
    *  @Component.Builder
    *   interface Builder {
    *     MyComponent build();
    *     Builder backendModule(BackendModule bm);
    *     Builder frontendModule(FrontendModule fm);
    *   }
    }

那我们将修改代码如下

@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {

    fun sharedPreferences(): SharedPreferences

    fun myApplication(): Context

    fun inject(application: MyApplication)


    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: MyApplication): Builder

        fun build(): AppComponent

        fun appModule(appModule: AppModule): Builder

    }
}

但是很不幸,上面的问题解决了,但是有派生出了新的问题

E:\ASWorkSpace\IntelligentXiaoK\daggerdemo\build\tmp\kapt3\stubs\debug\com\tdk\daggerdemo\AppComponent.java:21: 错误: java.util.Map<java.lang.Class<? extends android.app.Activity>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.app.Activity>>> cannot be provided without an @Provides-annotated method.
    public abstract void inject(@org.jetbrains.annotations.NotNull()
                         ^
      java.util.Map<java.lang.Class<? extends android.app.Activity>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.app.Activity>>> is injected at
          dagger.android.DispatchingAndroidInjector.<init>(injectorFactories)
      dagger.android.DispatchingAndroidInjector<android.app.Activity> is injected at
          com.hp.baseres.base.BaseApplication.mActivityInjector
      com.tdk.daggerdemo.MyApplication is injected at
          com.tdk.daggerdemo.AppComponent.inject(application)

解释:
就是inject报错,

java.lang.RuntimeException: Unable to create application com.tdk.daggerdemo.MyApplication: java.lang.IllegalStateException: com.tdk.daggerdemo.MyApplication must be set
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5548)
        at android.app.ActivityThread.-wrap2(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1612)
        at android.os.Handler.dispatchMessage(Handler.java:110)
        at android.os.Looper.loop(Looper.java:203)
        at android.app.ActivityThread.main(ActivityThread.java:6293)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
     Caused by: java.lang.IllegalStateException: com.tdk.daggerdemo.MyApplication must be set
        at com.tdk.daggerdemo.DaggerAppComponent$Builder.build(DaggerAppComponent.java:55)
        at com.tdk.daggerdemo.MyApplication.inject(MyApplication.kt:29)
        at com.tdk.daggerdemo.MyApplication.onCreate(MyApplication.kt:21)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5545)
 Process: com.tdk.daggerdemo, PID: 15300
    java.lang.RuntimeException: Unable to create application com.tdk.daggerdemo.MyApplication: kotlin.UninitializedPropertyAccessException: lateinit property mSharedPreferencesEditor has not been initialized
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5548)
        at android.app.ActivityThread.-wrap2(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1612)
        at android.os.Handler.dispatchMessage(Handler.java:110)
        at android.os.Looper.loop(Looper.java:203)
        at android.app.ActivityThread.main(ActivityThread.java:6293)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
     Caused by: kotlin.UninitializedPropertyAccessException: lateinit property mSharedPreferencesEditor has not been initialized
        at com.tdk.daggerdemo.MyApplication.onCreate(MyApplication.kt:55)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5545)

3.Android resource linking failed

Caused by: com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource linking failed
N:\ASWorkSpace\JetPackFrame\daggerdemo\src\main\res\layout\activity_main.xml:9: AAPT: error: attribute layout_constraintBottom_toBottomOf (aka com.tdk.daggerdemo:layout_constraintBottom_toBottomOf) not found.
    
N:\ASWorkSpace\JetPackFrame\daggerdemo\src\main\res\layout\activity_main.xml:9: AAPT: error: attribute layout_constraintEnd_toEndOf (aka com.tdk.daggerdemo:layout_constraintEnd_toEndOf) not found.

解决方案:

由日志可以看出是ConstraintLayout布局的问题,本项目中是因为整个工程的某个Moude引入了ConstraintLayout,但是当前Moude没有直接或间接模式调用,所以就报错了。只要在本Module引入ConstraintLayout就好

4. InputDispatcher: channel '817b677 xxxxxx.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!

分析:
本人是通过startActivity()打开一个Unity 游戏,第一次打开会报错(错误日志如下),无法进入游戏;第二次可以正常打开。在多个Unity游戏中,有部分正常,经过分析是Unity打包版本不同,切换到对应Unity版本重新打包,问题解决。

 E/InputDispatcher: channel '817b677 com.mathtrain.daban5.rotatingshape/com.kimi.hqg_mathlogic.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!

解决方案:

unity5.6.6版本bug:第一次打开需要打开两次。
unity5.3.6在安卓7以下会出现防近视后没声音
将版本unity5.6.6改为unity5.3.6

5. Dagger does not support injection into private fields

 Dagger does not support injection into private fields
    private iammert.com.dagger_android_injection.ui.detail.DetailPresenter detailPresenter;

原因和解决方案:

  1. 方案一

Kotlin 生成.java文件时属性默认为 private,给属性添加@JvmField声明可以转成 public

  1. 方案二
    @inject 用于注解属性的set方法
 var x: MyDependency?=null
        @inject set

6. ActivityScope may not reference bindings with different scopes:

7. ActivityScope may not reference bindings with different scopes:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值