[在API 22或更低版本上使用guava谓词与Java 8时应用程序崩溃

问题描述 投票:0回答:1

我正在将一个旧的Android项目更新为新的项目,但是我在API 22及以下设备上遇到问题。

我已经在应用程序级别build.gradle文件中启用了Java 8,并且使用番石榴编写了一些代码来过滤列表,该列表在API级别22或以下设备的应用程序上崩溃了。

下面是我创建的用于测试问题的函数,它也像在Initializing predicate中打印logcat之后的原始崩溃一样崩溃:

import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;

...

private void testCrashFunction() {

    Log.d("log", "Initializing predicate");
    Predicate<String> predicate = new Predicate<String>() {
        @Override
        public boolean apply(@NullableDecl String input) {
            return input.startsWith("A") || input.startsWith("J");
        }
    };

    Log.d("log", "Created predicate");

    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");

    Log.d("log", "Filtering List...");
    List<String> filteredList = Lists.newArrayList(Collections2.filter(names, predicate));
    Log.d("log", "Filtered List");
}

我在主要活动中调用此函数。

下面是崩溃日志:

04-30 15:03:28.364 11555-11555/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapp, PID: 11555
java.lang.NoClassDefFoundError: com.example.myapp.MainActivity$e
    at com.example.myapp.MainActivity.F(MyApplication:440)
    at com.example.myapp.MainActivity.onCreate(MyApplication:95)
    at android.app.Activity.performCreate(Activity.java:5990)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
    at android.app.ActivityThread.access$800(ActivityThread.java:151)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    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:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

我也尝试过使用流而不是番石榴,但仍然没有用。

下面是我用于流的代码

private void testCrashFunction() {
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    List<String> filteredList = names.stream().filter(input -> input.startsWith("A") || input.startsWith("J")).collect(Collectors.toList());
}

下面是我得到的错误:

04-30 15:23:41.476 11818-11818/com.example.myapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapp, PID: 11818
java.lang.NoSuchMethodError: No interface method stream()Ljava/util/stream/Stream; in class Ljava/util/List; or its super classes (declaration of 'java.util.List' appears in /system/framework/core-libart.jar)
    at com.example.myapp.MainActivity.F(MyApplication:456)
    at com.example.myapp.MainActivity.onCreate(MyApplication:96)
    at android.app.Activity.performCreate(Activity.java:5990)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
    at android.app.ActivityThread.access$800(ActivityThread.java:151)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    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:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

启用Java 8后,番石榴可能会崩溃的问题。它以前工作正常,但在我将项目更新为java8和androidx之后,现在崩溃了(我认为这可能不是问题。

[如果您需要其他详细信息,请告诉我。

提前感谢:)

java android java-8 guava
1个回答
0
投票

好。我想出了什么问题,这归功于@AmniX。

我相信最好把它放在这里,因为有人可能会在这个问题上浪费像我一样的时间。

在我正在从事的项目中,使用了番石榴jre代替了番石榴android

因此,请确保您是否遇到这种情况。只需将jre替换为android,如下所示

   // don't use jre version in android
   api 'com.google.guava:guava:29.0-jre'

   // replace jre with android
   api 'com.google.guava:guava:29.0-android'

来源:https://stackoverflow.com/a/48378440/7071039

© www.soinside.com 2019 - 2024. All rights reserved.