Android 无法启动活动,无法创建转换器:使用改装
我试图使用GET请求调用api,但我得到一个错误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
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
类。使用序列化的注释定义的名称应与响应中的名称完全匹配。