0

我尝试使用自动值设置一个不可变列表。我遵循了官方的用户指南,该指南建议实施类似的方法:

@AutoValue
public abstract class ListExample {
  public static ListExample create(String[] mutableNames) {
    return new AutoValue_ListExample(ImmutableList.copyOf(mutableNames));
  }

  public abstract ImmutableList<String> names();
}

我的实现是下一个:

@AutoValue
public abstract class MovieList {

    @SerializedName("results")
    //if a change ImmutableList to simple List right below
    //the Retrofit call works and my Object is printed.
    public abstract ImmutableList<Movie> movies();

    public static TypeAdapter<MovieList> typeAdapter(Gson gson) {
        return new AutoValue_MovieList.GsonTypeAdapter(gson);
    }
}

我想遍历作为改造调用响应的 MovieList 对象的电影。

movieService.getPopularMovies().enqueue(new Callback<MovieList>() {
                @Override
                public void onResponse(Call<MovieList> call, Response<MovieList> response) {
                    if(response.isSuccessful()){

                        for(Movie m: response.body().movies()){
                            Timber.e(m.originalTitle());
                        }
                    }
                }

                @Override
                public void onFailure(Call<MovieList> call, Throwable t) {
                    Timber.e(t.toString());
                }
            });

上面的改造调用会导致以下堆栈跟踪:

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/common/collect/ImmutableList;
    at com.oviesm.models.AutoValue_MovieList$GsonTypeAdapter.<init>(AutoValue_MovieList.java:21)
    at com.oviesm.models.MovieList.typeAdapter(MovieList.java:24)
    at com.oviesm.dependencies.factories.AutoValueGson_MyAdapterFactory.create(AutoValueGson_MyAdapterFactory.java:19)
    at com.google.gson.Gson.getAdapter(Gson.java:423)
    at retrofit2.converter.gson.GsonConverterFactory.responseBodyConverter(GsonConverterFactory.java:63)
    at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:325)
    at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:308)
    at retrofit2.ServiceMethod$Builder.createResponseConverter(ServiceMethod.java:704)
    at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:167)
    at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:166)
    at retrofit2.Retrofit$1.invoke(Retrofit.java:145)
    at java.lang.reflect.Proxy.invoke(Proxy.java:393)
    at $Proxy0.getPopularMovies(Unknown Source)
    at com.oviesm.activities.MainActivity.onCreate(MainActivity.java:40)
    at android.app.Activity.performCreate(Activity.java:6237)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.common.collect.ImmutableList" on path: DexPathList[[dex file "/data/data/com.oviesm/files/instant-run/dex/slice-support-annotations-24.2.1_c58c21259b49dee274cade92b4da707c59aa2c82-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-slice_1-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-slice_0-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-retrofit-2.1.0_691a200d4fb928332b4740a763ecb5b64166c64d-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-picasso2-okhttp3-downloader-1.1.0_3fe320104c8be5d03d13617741bd1e383fe7aa3e-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-picasso-2.5.2_e72c8c2e003fe3874e0b925f9d1aa0b21f66055d-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-okio-1.11.0_79ac733fa889ba614e6d38e4a65b631b37417580-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-okhttp-3.5.0_2a1e0e3ae2bf6a5168289158a20878f9e1e13d11-classes.dex", dex file "/data/data/com.oviesm/files/instant-run/dex/slice-logging-interceptor-3.5.0_7622cecaaef176468f6389f00c5a52b29da046d5-classes.dex", dex file "/data/data

如果在上面的 MovieList 抽象类中将 ImmutableList 更改为简单 List,则 Retrofit 调用将起作用并且我的 Object 将被打印。是否需要添加一些依赖项?我的 ImmutableList 从com.google.common.collect.ImmutableList现在导入。

我应该如何设置 ImmutableList 依赖项以便能够遍历 MovieList 对象?

4

0 回答 0