Android 应用程序抛出 Guice 异常

Android application throws Guice exception

我是 Android 应用程序的新手,可能做错了什么。 我试图用 javampd 模块编译应用程序,但它抛出一个异常:"com.google.inject.internal.util.$ComputationException: com.google.inject.internal.util.$ComputationException: java.lang.ExceptionInInitializerError" 在 biulder 创建时:

try {
    MPD.Builder mpdBuilder = new MPD.Builder();
} catch (Exception error) {
    String text = error.getMessage();
    Toast.makeText(this, "Exception: " + text, Toast.LENGTH_LONG).show();
}

我已将异常追溯到 Guice,并发现异常是在 javampd 模块中抛出的

injector = Guice.createInjector(new MPDModule());

这是完整的堆栈跟踪:

W/nalizableReferenceQueue: Could not load Finalizer in its own class loader. Loading Finalizer in the current class loader instead. As a result, you will not be able to garbage collect this class loader. To support reclaiming this class loader, either resolve the underlying issue, or move Google Collections to your system class path.
                           java.io.FileNotFoundException: com/google/inject/internal/util/$Finalizer.class
                               at com.google.inject.internal.util.$FinalizableReferenceQueue$DecoupledLoader.getBaseUrl(FinalizableReferenceQueue.java:269)
                               at com.google.inject.internal.util.$FinalizableReferenceQueue$DecoupledLoader.loadFinalizer(FinalizableReferenceQueue.java:253)
                               at com.google.inject.internal.util.$FinalizableReferenceQueue.loadFinalizer(FinalizableReferenceQueue.java:175)
                               at com.google.inject.internal.util.$FinalizableReferenceQueue.<clinit>(FinalizableReferenceQueue.java:100)
                               at com.google.inject.internal.util.$MapMaker$QueueHolder.<clinit>(MapMaker.java:787)
                               at com.google.inject.internal.util.$MapMaker$WeakEntry.<init>(MapMaker.java:946)
                               at com.google.inject.internal.util.$MapMaker$Strength.newEntry(MapMaker.java:312)
                               at com.google.inject.internal.util.$MapMaker$StrategyImpl.newEntry(MapMaker.java:498)
                               at com.google.inject.internal.util.$MapMaker$StrategyImpl.newEntry(MapMaker.java:419)
                               at com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2029)
                               at com.google.inject.internal.Annotations$AnnotationChecker.hasAnnotations(Annotations.java:116)
                               at com.google.inject.internal.Annotations.isScopeAnnotation(Annotations.java:124)
                               at com.google.inject.internal.ScopeBindingProcessor.visit(ScopeBindingProcessor.java:40)
                               at com.google.inject.internal.ScopeBindingProcessor.visit(ScopeBindingProcessor.java:30)
                               at com.google.inject.spi.ScopeBinding.acceptVisitor(ScopeBinding.java:59)
                               at com.google.inject.internal.AbstractProcessor.process(AbstractProcessor.java:55)
                               at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:165)
                               at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103)
                               at com.google.inject.Guice.createInjector(Guice.java:95)
                               at com.google.inject.Guice.createInjector(Guice.java:72)
                               at com.google.inject.Guice.createInjector(Guice.java:62)
                               at org.bff.javampd.MPD$Builder.<init>(MPD.java:186)
                               at com.yarygin.alex.mpd_test.MainActivity.onCreate(MainActivity.java:16)
                               at android.app.Activity.performCreate(Activity.java:5971)
                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413)
                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2522)
                               at android.app.ActivityThread.access0(ActivityThread.java:167)
                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1417)
                               at android.os.Handler.dispatchMessage(Handler.java:111)
                               at android.os.Looper.loop(Looper.java:194)
                               at android.app.ActivityThread.main(ActivityThread.java:5534)
                               at java.lang.reflect.Method.invoke(Native Method)
                               at java.lang.reflect.Method.invoke(Method.java:372)
                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)
                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)

我的 gradle 文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"
    defaultConfig {
        applicationId "com.yarygin.alex.mpd_test"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:22.2.1'
    testCompile 'junit:junit:4.12'
    compile 'net.thejavashop:javampd:5.0.3'
}

还有我的 Activity 文件:

package com.yarygin.alex.mpd_test;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import org.bff.javampd.MPD;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            MPD.Builder mpdBuilder = new MPD.Builder();
        } catch (Exception error) {
            String text = error.getMessage();
            Toast.makeText(this, "Exception: " + text, Toast.LENGTH_LONG).show();
        }
    }
}

我两周都找不到原因。请帮忙!

虽然 Android 应用程序是用 Java 编写的,但您通常不能简单地使用 Java 库并在 Android 应用程序中使用它们而不会出现配置问题。

如果该库 Java MPD 在内部依赖于 Guice,则很难在 Android 项目中按原样使用。这是因为 Guice 在使用 Android 时存在许多配置问题。此外,还有一些其他问题需要考虑。为了演示,我引用了 Android 的其他 DI 框架之一的 FAQ:

  1. Guice is slow, at least it didn't match any more the expected performance of Android apps.
  2. Guice 4 uses Guava which contains tens of thousands of methods that contribute to multidex issues and heavy apks
  3. Guice uses reflection and reflection is especially slow on Android. Mostly because there is no JIT of reflection code as opposed to PC JVMs.

您可以尝试使用 Roboguice,它使用 Guice 的分支和注释处理器来解决 Guice 使用反射和其他与 Android 的集成问题。如果这提供了足够的 Guice 类 来使您的 MDP 库工作,我会感到惊讶。否则,您将不得不寻找另一个库来使用。