Android 无法启动活动,无法创建转换器:使用改装

Android 无法启动活动,无法创建转换器:使用改装,android,gson,retrofit2,Android,Gson,Retrofit2,我试图使用GET请求调用api,但我得到一个错误 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.movino, PID: 20106 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.movino/com.example.movino.MainActivity}: java.lang.Illegal

我试图使用GET请求调用api,但我得到一个错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.movino, PID: 20106
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.movino/com.example.movino.MainActivity}: java.lang.IllegalArgumentException: Unable to create converter for class com.example.movino.MoviesResponse
        for method TMBDApi.getPopular
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2946)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3081)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6810)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
     Caused by: java.lang.IllegalArgumentException: Unable to create converter for class com.example.movino.MoviesResponse
        for method TMBDApi.getPopular
        at retrofit2.Utils.methodError(Utils.java:52)
        at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:115)
        at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:82)
        at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:37)
        at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170)
        at retrofit2.Retrofit$1.invoke(Retrofit.java:149)
        at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
        at $Proxy0.getPopular(Unknown Source)
        at com.example.movino.MoviesRepository.getMovies(MoviesRepository.java:38)
        at com.example.movino.MainActivity.onCreate(MainActivity.java:29)
        at android.app.Activity.performCreate(Activity.java:7224)
        at android.app.Activity.performCreate(Activity.java:7213)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2926)
            ... 11 more
     Caused by: java.lang.IllegalArgumentException: class com.example.movino.Movie declares multiple JSON fields named title
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:170)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at retrofit2.converter.gson.GsonConverterFactory.responseBodyConverter(GsonConverterFactory.java:64)
        at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:330)
        at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:313)
        at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:113)
            ... 23 more
代码如下:

主要活动:

public class MainActivity extends AppCompatActivity {

    private RecyclerView moviesList;
    private MovieAdapter adapter;

    private MoviesRepository moviesRepository;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        moviesRepository = MoviesRepository.getInstance();

        moviesList = findViewById(R.id.recycler_view);
        moviesList.setLayoutManager(new LinearLayoutManager(this));

        moviesRepository.getMovies(new OnGetMoviesCallBack() {
            @Override
            public void onSuccess(List<Movie> movies) {
                adapter = new MovieAdapter(movies);
                moviesList.setAdapter(adapter);
            }

            @Override
            public void onError() {
                Toast.makeText(MainActivity.this, "Please check your internet connection.", Toast.LENGTH_SHORT).show();
            }
        });
    }
}
public类MainActivity扩展了AppCompatActivity{
私人回收电影列表;
私人电影适配器;
私有电影资源库电影资源库;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
moviesRepository=moviesRepository.getInstance();
moviesList=findviewbyd(R.id.recycler\u视图);
moviesList.setLayoutManager(新的LinearLayoutManager(this));
moviesRepository.getMovies(新OnGetMoviesCallBack(){
@凌驾
成功时公开作废(列出电影){
适配器=新电影适配器(电影);
moviesList.setAdapter(适配器);
}
@凌驾
公开无效{
Toast.makeText(MainActivity.this,“请检查您的internet连接”,Toast.LENGTH_SHORT.show();
}
});
}
}
电影拍摄地点:

public class MoviesRepository {

    public final static String BASE_URL="Base_Url";
    public final static String LANGUAGE="en-US";

    public static MoviesRepository repository;

    private TMBDApi api;

    private MoviesRepository(TMBDApi api){
        this.api=api;
    }

    public static MoviesRepository getInstance(){
        if(repository==null){
            Retrofit retrofit= new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

            repository=new MoviesRepository(retrofit.create(TMBDApi.class));
        }

        return repository;
    }

    public void getMovies(final OnGetMoviesCallBack callBack){
        api.getPopular("api_key",LANGUAGE,1)
                .enqueue(new Callback<MoviesResponse>() {
                    @Override
                    public void onResponse(Call<MoviesResponse> call, Response<MoviesResponse> response) {
                        if(response.isSuccessful()){
                            MoviesResponse moviesResponse=response.body();
                            if(moviesResponse!=null && moviesResponse.getMovies()!=null){
                                callBack.onSuccess(moviesResponse.getMovies());
                            }
                            else callBack.onError();
                        }
                        else callBack.onError();
                    }

                    @Override
                    public void onFailure(Call<MoviesResponse> call, Throwable t) {
                        callBack.onError();
                    }
                });
    }

}
公共类电影存储库{
公共最终静态字符串BASE\u URL=“BASE\u URL”;
公共最终静态字符串语言=“en US”;
公共静态电影存储库;
私人TMBDApi;
私有电影存储库(TMBDApi){
这个.api=api;
}
公共静态MoviesRepository getInstance(){
if(存储库==null){
改装改装=新改装.Builder()
.baseUrl(基本URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
repository=newmoviesrepository(reformation.create(TMBDApi.class));
}
返回存储库;
}
公共无效getMovies(最终OnGetMovies回调){
api.getPopular(“api_键”,语言,1)
.enqueue(新的回调函数(){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
MoviesResponse MoviesResponse=response.body();
if(moviesResponse!=null&&moviesResponse.getMovies()!=null){
onSuccess(moviesResponse.getMovies());
}
else callBack.onError();
}
else callBack.onError();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
callBack.onError();
}
});
}
}
电影责任:

public class MoviesResponse {

    @SerializedName("page")
    @Expose
    private int page;

    @SerializedName("total_results")
    @Expose
    private int totalResults;

    @SerializedName("results")
    @Expose
    private List<Movie> movies;

    @SerializedName("total_pages")
    @Expose
    private int totalPages;

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getTotalResults() {
        return totalResults;
    }

    public void setTotalResults(int totalResults) {
        this.totalResults = totalResults;
    }

    public List<Movie> getMovies() {
        return movies;
    }

    public void setMovies(List<Movie> movies) {
        this.movies = movies;
    }

    public int getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(int totalPages) {
        this.totalPages = totalPages;
    }
}
公共类电影响应{
@序列化名称(“页面”)
@暴露
私人网页;
@SerializedName(“总结果”)
@暴露
私人投资结果;
@SerializedName(“结果”)
@暴露
私人电影名单;
@序列化名称(“总页数”)
@暴露
私人网页;
公共int getPage(){
返回页面;
}
公共无效设置页(整版页){
this.page=page;
}
public int getTotalResults(){
返回结果;
}
公共void setTotalResults(int totalResults){
this.totalResults=totalResults;
}
公共列表getMovies(){
返回电影;
}
公共电影(列出电影){
这部电影=电影;
}
公共int getTotalPages(){
返回总页数;
}
公共无效setTotalPages(整版totalPages){
this.totalPages=totalPages;
}
}

在使用Gson转换器之后,我仍然得到这个错误。在这里,通过主要活动,我给电影摄影课打电话。在MovieRepository中,我们定义了存储库。之后,我们使用api变量来获得响应。我不理解这个错误。我不熟悉api调用,所以我真的需要了解解决方案

您能提供您的MovieResponse类代码吗?错误是关于将json转换为java对象。转换器无法转换。添加一个json示例和你的
MoviesResponse.java
你能给我们展示一下你的数据类吗?我已经编辑了这个问题,问题似乎出在
Movie.java
类上<代码>原因:java.lang.IllegalArgumentException:class com.example.movino.Movie声明了多个名为title的JSON字段,请先查看该类,然后转到
MovieResponse.java
类。使用
序列化的
注释定义的名称应与响应中的名称完全匹配。