java - Android 应用程序抛出 Guice 异常

标签 java android gradle guice

我是 Android 应用程序的新手,可能做错了什么。 在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$1.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.access$800(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 时存在许多配置问题。此外,还有一些其他问题需要考虑。为了演示,我引用了 FAQ Android 的其他 DI 框架之一:

  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 库正常工作,我会感到惊讶。否则,您将不得不寻找另一个库来使用。

关于java - Android 应用程序抛出 Guice 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40441906/

相关文章:

Java EE 和 Java ME 应用程序集成

java - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure Software caused connection abort: recv failed

android - 如何降级我的 Android Studio 项目中的 gradle wrapper 版本?

android - 绘制多条线并记住它们的粗细

gradle - 如何将多个Gradle脚本调用到其他Gradle脚本中

java - IIS中的网站与tomcat连接

java - 如何将共享首选项文件从内部存储传输到外部存储?

java - 错误 无法访问 zza

maven - Maven 任务的 Gradle 项目构建顺序

android - 如何将一个lib结构复杂的Eclipse workspace导入到Android Studio中?