改造,onResponse 方法不起作用
Retrofit,onResponse method doesnt work
我是 Retrofit 的新手,尝试从一个 Web 服务器获取数据,创建模型,接口,但这仍然不是 working.Problem(可能)在方法 onResponse() 中我添加到该方法 Log.d和 Toast,但在启动我的 app.Why 时我没有看到 Log 和 Toast,它不起作用?当我得到错误的响应或其他问题时我能理解,但是 onResponse() 通常不起作用,我 think.Maybe Toast 没有数据就不能工作,但是 Log.d 没有它就必须工作,并且 Log.d 没有数据,只有响应代码。我添加了所有依赖项并像在所有教程中一样尝试这样做,我做错了什么以及我可以做些什么来解决这个问题?而且我尝试将此数据放入适配器,但是当启动应用程序时,我在日志 "RecyclerView: No adapter attached; skipping layout" 中有错误可能是相同的 problem.onResponse 不工作并且适配器没有创建,因为适配器在 onResponse 方法中初始化如果 onResponse 不起作用,recyclerview 的 setadapter 不起作用 to.And
VideoApi class:
public interface VideoApi {
@GET("/videos/featured")
Call<List<Video>>getFeaturedVideo();
}
视频class:
public class Video {
@SerializedName("url")
@Expose
private String url;
@SerializedName("title")
@Expose
private String title;
@SerializedName("description")
@Expose
private String description;
@SerializedName("score")
@Expose
private Integer score;
/**
*
* @return
* The url
*/
public String getUrl() {
return url;
}
/**
*
* @param url
* The url
*/
public void setUrl(String url) {
this.url = url;
}
/**
*
* @return
* The title
*/
public String getTitle() {
return title;
}
/**
*
* @param title
* The title
*/
public void setTitle(String title) {
this.title = title;
}
/**
*
* @return
* The description
*/
public String getDescription() {
return description;
}
/**
*
* @param description
* The description
*/
public void setDescription(String description) {
this.description = description;
}
/**
*
* @return
* The score
*/
public Integer getScore() {
return score;
}
/**
*
* @param score
* The score
*/
public void setScore(Integer score) {
this.score = score;
}
}
精选片段:
public class FeaturedFragment extends Fragment {
RecyclerViewAdapter recyclerViewAdapter;
public static final String ROOT_URL = "https://api.vid.me/";
public List <Video> videos;
RecyclerView recList;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_featured, container, false);
recList = (RecyclerView) rootView.findViewById(R.id.cardList);
recList.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
llm.setOrientation(LinearLayoutManager.VERTICAL);
recList.setLayoutManager(llm);
try {
getVideos();
} catch (IOException e) {
e.printStackTrace();
}
return rootView;
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
private void getVideos() throws IOException {
Retrofit retrofitAdapter = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(ROOT_URL)
.build();
final VideoApi videoApi = retrofitAdapter.create(VideoApi.class);
Call<List<Video>> call = videoApi.getFeaturedVideo();
call.enqueue(new Callback<List<Video>>() {
@Override
public void onResponse(Call<List<Video>> call, Response<List<Video>> response) {
Log.d("MainActivity", "Status Code = " + response.code());
videos.addAll(response.body());
recyclerViewAdapter = new RecyclerViewAdapter(videos);
String result = response.body().get(0).getTitle();
Toast.makeText(getActivity(), result, Toast.LENGTH_SHORT).show();
recList.setAdapter(recyclerViewAdapter);
}
@Override
public void onFailure(Call<List<Video>> call, Throwable t) {
}
});
}
}
您的 json 响应 returns Video
对象数组。
将 Call
对象中的 List<Video>
更改为 Videos
其中 Videos
class 被定义为 -
public class Videos {
List<Video> videos;
}
改成这样-
Call<Videos> call = videoApi.getFeaturedVideo();
call.enqueue(new Callback<Videos>() {
@Override
public void onResponse(Call<Videos> call, Response<Videos> response) {
Log.d("MainActivity", "Status Code = " + response.code());
videos = response.body().videos;
recyclerViewAdapter = new RecyclerViewAdapter(videos);
recList.setAdapter(recyclerViewAdapter);
}
@Override
public void onFailure(Call<Videos> call, Throwable t) {
}
});
}
此外,更改 -
@GET("/videos/featured")
Call<Videos>getFeaturedVideo();
我是 Retrofit 的新手,尝试从一个 Web 服务器获取数据,创建模型,接口,但这仍然不是 working.Problem(可能)在方法 onResponse() 中我添加到该方法 Log.d和 Toast,但在启动我的 app.Why 时我没有看到 Log 和 Toast,它不起作用?当我得到错误的响应或其他问题时我能理解,但是 onResponse() 通常不起作用,我 think.Maybe Toast 没有数据就不能工作,但是 Log.d 没有它就必须工作,并且 Log.d 没有数据,只有响应代码。我添加了所有依赖项并像在所有教程中一样尝试这样做,我做错了什么以及我可以做些什么来解决这个问题?而且我尝试将此数据放入适配器,但是当启动应用程序时,我在日志 "RecyclerView: No adapter attached; skipping layout" 中有错误可能是相同的 problem.onResponse 不工作并且适配器没有创建,因为适配器在 onResponse 方法中初始化如果 onResponse 不起作用,recyclerview 的 setadapter 不起作用 to.And VideoApi class:
public interface VideoApi {
@GET("/videos/featured")
Call<List<Video>>getFeaturedVideo();
}
视频class:
public class Video {
@SerializedName("url")
@Expose
private String url;
@SerializedName("title")
@Expose
private String title;
@SerializedName("description")
@Expose
private String description;
@SerializedName("score")
@Expose
private Integer score;
/**
*
* @return
* The url
*/
public String getUrl() {
return url;
}
/**
*
* @param url
* The url
*/
public void setUrl(String url) {
this.url = url;
}
/**
*
* @return
* The title
*/
public String getTitle() {
return title;
}
/**
*
* @param title
* The title
*/
public void setTitle(String title) {
this.title = title;
}
/**
*
* @return
* The description
*/
public String getDescription() {
return description;
}
/**
*
* @param description
* The description
*/
public void setDescription(String description) {
this.description = description;
}
/**
*
* @return
* The score
*/
public Integer getScore() {
return score;
}
/**
*
* @param score
* The score
*/
public void setScore(Integer score) {
this.score = score;
}
}
精选片段:
public class FeaturedFragment extends Fragment {
RecyclerViewAdapter recyclerViewAdapter;
public static final String ROOT_URL = "https://api.vid.me/";
public List <Video> videos;
RecyclerView recList;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_featured, container, false);
recList = (RecyclerView) rootView.findViewById(R.id.cardList);
recList.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
llm.setOrientation(LinearLayoutManager.VERTICAL);
recList.setLayoutManager(llm);
try {
getVideos();
} catch (IOException e) {
e.printStackTrace();
}
return rootView;
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
private void getVideos() throws IOException {
Retrofit retrofitAdapter = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(ROOT_URL)
.build();
final VideoApi videoApi = retrofitAdapter.create(VideoApi.class);
Call<List<Video>> call = videoApi.getFeaturedVideo();
call.enqueue(new Callback<List<Video>>() {
@Override
public void onResponse(Call<List<Video>> call, Response<List<Video>> response) {
Log.d("MainActivity", "Status Code = " + response.code());
videos.addAll(response.body());
recyclerViewAdapter = new RecyclerViewAdapter(videos);
String result = response.body().get(0).getTitle();
Toast.makeText(getActivity(), result, Toast.LENGTH_SHORT).show();
recList.setAdapter(recyclerViewAdapter);
}
@Override
public void onFailure(Call<List<Video>> call, Throwable t) {
}
});
}
}
您的 json 响应 returns Video
对象数组。
将 Call
对象中的 List<Video>
更改为 Videos
其中 Videos
class 被定义为 -
public class Videos {
List<Video> videos;
}
改成这样-
Call<Videos> call = videoApi.getFeaturedVideo();
call.enqueue(new Callback<Videos>() {
@Override
public void onResponse(Call<Videos> call, Response<Videos> response) {
Log.d("MainActivity", "Status Code = " + response.code());
videos = response.body().videos;
recyclerViewAdapter = new RecyclerViewAdapter(videos);
recList.setAdapter(recyclerViewAdapter);
}
@Override
public void onFailure(Call<Videos> call, Throwable t) {
}
});
}
此外,更改 -
@GET("/videos/featured")
Call<Videos>getFeaturedVideo();