解析失败:Lcom/google/common/collect/ImmutableMap;在 com.my.app.di.DaggerMyApplicationComponent.getMapOfClassOfAndProviderOfFactoryOf(

Saj*_*Zeb 2 java android dependency-injection android-studio dagger-2

在集成 Dagger 2 以在运行应用程序时实现 ImageDownloader 库的依赖注入后,我遇到了这个问题。

\n\n

这就是我所做的:

\n\n

在 build.gradle 中。我添加了这些行:

\n\n
implementation "com.google.dagger:dagger:2.16"\nimplementation "com.google.dagger:dagger-android-support:2.16"\nannotationProcessor "com.google.dagger:dagger-compiler:2.16"\nannotationProcessor "com.google.dagger:dagger-android-processor:2.16"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的类 API,我想在其中将依赖项与活动类分开:

\n\n
public class ImageDownloaderApi {\n\n    @Inject\n    public ImageDownloaderApi(){\n    }\n\n    //some other methods here\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我的中MainActivity我添加了这些行:

\n\n
public class MainActivity extends Activity {\n\n    @Inject\n    ImageDownloaderApi imageDownloaderApi;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        AndroidInjection.inject(this);\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后创建了一个Application对象:

\n\n
public class MyApplication extends Application {\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Application然后通过清单注册该类,如下所示:

\n\n
<application\n    android:name=".MyApplication"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我创建了一个名为MyApplicationModule如下的模块:

\n\n
@Module\npublic abstract class MyApplicationModule {\n    @ContributesAndroidInjector\n    abstract MainActivity contributeActivityInjector();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我创建了一个名为的接口MyApplicationComponent

\n\n
@Component(modules = { AndroidInjectionModule.class, MyApplicationModule.class})\npublic interface MyApplicationComponent extends AndroidInjector<MyApplication> {\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

MyApplication班级:

\n\n
public class MyApplication extends Application implements HasActivityInjector {\n    @Inject\n    DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        DaggerMyApplicationComponent.create().inject(this);\n    }\n\n    @Override\n    public DispatchingAndroidInjector<Activity> activityInjector() {\n        return dispatchingAndroidInjector;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,在此实现之后,当我在模拟器中运行应用程序时,应用程序崩溃并显示以下日志:

\n\n
  --------- beginning of crash\n11-20 14:51:03.201 6745-6745/com.my.app E/AndroidRuntime: FATAL EXCEPTION: main\n    Process: com.my.app, PID: 6745\n    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/common/collect/ImmutableMap;\n    at com.my.app.di.DaggerMyApplicationComponent.getMapOfClassOfAndProviderOfFactoryOf(DaggerMyApplicationComponent.java:36)\n    at com.my.app.di.DaggerMyApplicationComponent.getDispatchingAndroidInjectorOfActivity(DaggerMyApplicationComponent.java:42)\n    at com.my.app.di.DaggerMyApplicationComponent.injectMyApplication(DaggerMyApplicationComponent.java:68)\n    at com.my.app.di.DaggerMyApplicationComponent.inject(DaggerMyApplicationComponent.java:62)\n    at com.my.app.di.DaggerMyApplicationComponent.inject(DaggerMyApplicationComponent.java:16)\n    at com.my.app.di.MyApplication.onCreate(MyApplication.java:19)\n    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1012)\n    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4553)\n    at android.app.ActivityThread.access$1500(ActivityThread.java:151)\n    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)\n    at android.os.Handler.dispatchMessage(Handler.java:102)\n    at android.os.Looper.loop(Looper.java:135)\n    at android.app.ActivityThread.main(ActivityThread.java:5254)\n    at java.lang.reflect.Method.invoke(Native Method)\n    at java.lang.reflect.Method.invoke(Method.java:372)\n    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)\n     Caused by: java.lang.ClassNotFoundException: Didn\'t find class "com.google.common.collect.ImmutableMap" on path: DexPathList[[zip file "/data/app/com.my.app-1/base.apk"],nativeLibraryDirectories=[/data/app/com.my.app-1/lib/x86, /vendor/lib, /system/lib]]\n    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)\n    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)\n    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)\n    at com.my.app.di.DaggerMyApplicationComponent.getMapOfClassOfAndProviderOfFactoryOf(DaggerMyApplicationComponent.java:36)\xc2\xa0\n    at com.my.app.di.DaggerMyApplicationComponent.getDispatchingAndroidInjectorOfActivity(DaggerMyApplicationComponent.java:42)\xc2\xa0\n    at com.my.app.di.DaggerMyApplicationComponent.injectMyApplication(DaggerMyApplicationComponent.java:68)\xc2\xa0\n    at com.my.app.di.DaggerMyApplicationComponent.inject(DaggerMyApplicationComponent.java:62)\xc2\xa0\n    at com.my.app.di.DaggerMyApplicationComponent.inject(DaggerMyApplicationComponent.java:16)\xc2\xa0\n    at com.my.app.di.MyApplication.onCreate(MyApplication.java:19)\xc2\xa0\n    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1012)\xc2\xa0\n    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4553)\xc2\xa0\n    at android.app.ActivityThread.access$1500(ActivityThread.java:151)\xc2\xa0\n    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)\xc2\xa0\n    at android.os.Handler.dispatchMessage(Handler.java:102)\xc2\xa0\n    at android.os.Looper.loop(Looper.java:135)\xc2\xa0\n    at android.app.ActivityThread.main(ActivityThread.java:5254)\xc2\xa0\n    at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n    at java.lang.reflect.Method.invoke(Method.java:372)\xc2\xa0\n    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)\xc2\xa0\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)\xc2\xa0\n        Suppressed: java.lang.ClassNotFoundException: com.google.common.collect.ImmutableMap\n    at java.lang.Class.classForName(Native Method)\n    at java.lang.BootClassLoader.findClass(ClassLoader.java:781)\n    at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)\n    at java.lang.ClassLoader.loadClass(ClassLoader.java:504)\n            ... 18 more\n     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available\n
Run Code Online (Sandbox Code Playgroud)\n\n

欲了解更多信息。我还在上面发布的日志之前收到此警告行

\n\n
11-20 14:51:03.172 6745-6745/? E/libprocessgroup: failed to make and chown /acct/uid_10058: Read-only file system\n
Run Code Online (Sandbox Code Playgroud)\n

Saj*_*Zeb 5

Dagger 2 需要 Guava,所以我在我的build.gradle文件中添加了 Guava 库,问题得到解决。

添加这一行build.gradle

 api 'com.google.guava:guava:24.1-android'
Run Code Online (Sandbox Code Playgroud)