Skip to content
JessYan edited this page Apr 20, 2022 · 78 revisions

在这里陈列的内容是 Arms 框架的常见 Issues 以及解决方案,如果在这里没找到您需要的答案,不妨前往 历史 Issues 碰碰运气


1.Dagger 前缀的类为 Dagger2 使用 Apt 自动生成的,如果缺失的话,先把报错的部分注释掉,然后编译下项目,Dagger 前缀的类就自动生成了,这个时候打开注释就可以了, 更多 Dagger 注入的常见问题, 具体用法请参照 Dagger2官方文档.


2. Github 仓库的最新代码会领先于 Jcenter 远程库,具有下一个版本的新特性,所以会发现在 Github 仓库里最新的 Demo 上使用最新的远程库版本,会出现版本不兼容的情况,这时请进入 这里 查看对应的版本并下载下来删除 arms Module 后,将 Demo 依赖对应版本的远程库即可使用,也可以直接使用 git checkout (对应版本号, 如 v2.2.0) 切换到对应版本的 Release 代码, 直接使用 Module 模板 生成的代码将不会出现此类问题.

3. 在 Android 4.4 或以下版本如果突然出现 java.lang.NoClassDefFoundError 错误, 或者 java.lang.ClassNotFoundException 异常, 以及无缘无故提示 Unable to find ConfigModule 异常, 请根据这个 解决方案 处理, 也可以尝试下这个比较 简便的方式.

如果在 Android 5.0 或以上版本出现以上问题, 请在接入 com.android.support:multidex:x.y.z 后, 在当前 Modulebuild.gradle 中加入以下代码:

dexOptions {
     javaMaxHeapSize "4g"
     jumboMode = true
     preDexLibraries = false
     additionalParameters = [
             '--multi-dex',//多分包
             '--set-max-idx-number=60000'//每个包内方法数上限
     ]
 }

4. Arms 为什么建议使用 AndroidEventBus 而不是 greenrobotEventBus ,请看这里 我的回答, AndroidEventBus组件化 中也更容易定位和管理事件, 但 Arms 可以同时支持 AndroidEventBus 和 greenbot 的 EventBus, 您可以根据自己的需求自行选择使用哪个框架.

5. 第一次启动 app 时,冷启动会白屏很久,这并不是因为本框架导致的,是因为 Instant RunDebug 模式下会在第一次启动时部署一些资源,如果签名打 Release 安装包则不会出现冷启动很慢的情况,所以不用担心影响用户体验.

6. 在启动 app 时报如下错误: Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication,请将 Instant Run 关闭即可.

7. 当依赖 Espresso 遭遇 Conflict with dependency 'com.google.code.findbugs:jsr305' 错误时,请将以下代码加入到当前 Modulebuild.gradle 中:

dependencies {
  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') {
     exclude module: 'jsr305'
  }
}

8. Butterknife 找不到控件,报空指针异常,请将以下代码加入到当前 Modulebuild.gradle 中:

dependencies {
   annotationProcessor 'com.jakewharton:butterknife-compiler:x.y.z'
}

9. 本框架 master 分支使用的是 Rxjava2, rx1 分支使用的是 Rxjava1, rx1 分支已停止维护, 建议使用 master 分支, 也就是 2.x.x 版本.

10. 对于逻辑简单的页面可以不使用 Presenter,直接在 ActivityFragment 中处理逻辑,不给 ActivityFragment 指定 Presenter 的范型即不使用 Presenter,在 Presenter 中如果不需要处理数据,可以不提供 Model(BasePresenter 有一个只需要 View 的构造方法).

11. PresenterModel 都可以无限制的 复用, 所以 MVP 的划分不需要太细粒度, 稍微粗粒度一点, 即不需要每个 ActivityFragment 都给他划分一套 MVP, 可以几个 ActivityFragment 使用同一个 Presenter(使用同一个类不是同一个对象, 这个 Presenter 含有可以共用的逻辑), 也可一个 ActivityFragment 根据不同的需求持有多个不同类型的 Presenter 对象, Model 层同理, 这样灵活使用, 不仅延续了 MVP 的优点使项目低耦合易维护, 也缓解了 MVP 的缺点使项目减少了很多类和接口,但是怎么划分, 怎么掌握这个粒度, 就需要一定的经验, 这才是 MVP 的精髓.

12. 框架中的 Presenter 怎么注入的? 注入对象的来源?

13. 框架中 ButterKnife 的绑定.

14. 如何复用 Presenter? (一个 View 对应多个 Presenter)

15. 框架中如何集成 Tinker?

16. RxCache 出现 java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap 异常?

17. 框架是怎么在不继承 RxAppCompatActivity 的情况下完成 RxLifecycle 的绑定的?

18. Fragment 中, RxLifecycle 因未正常工作, 导致 mRootViewdoFinally 时为 null 抛出空指针

19. 如何将旧项目从 AndroidAutoLayout 迁移至 AndroidAutoSize

20. 框架不提供静态的全局 Context, 如果有这个需求, 请自行在 AppLifecyclesImplGlobalConfiguration 中新建静态方法, 两个类里面的大部分方法都能拿到 Context, 使用静态方法将 Context return 出去即可, 也可以自定义 Application