Volley + Gson 에 대하여 도움을 조금 받고싶습니다
조회수 531회
public class MovieFragment extends Fragment implements getData { TextView testText; ImageView imageView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.moviefragment, container, false);
testText = rootView.findViewById(R.id.textView);
imageView = rootView.findViewById(R.id.image);
if (AppHelper.requestQueue == null) {
AppHelper.requestQueue = Volley.newRequestQueue(getContext());
}
/꾼 requestMovieList("http://boostcourse-appapi.connect.or.kr:10000/movie/readMovie?id=1");
/저스티스리그 requestMovieList("http://boostcourse-appapi.connect.or.kr:10000/movie/readMovie?id=2");
/토르 requestMovieList("http://boostcourse-appapi.connect.or.kr:10000/movie/readMovie?id=3");
/러빙빈센트 requestMovieList("http://boostcourse-appapi.connect.or.kr:10000/movie/readMovie?id=4");
/범죄도시 requestMovieList("http://boostcourse-appapi.connect.or.kr:10000/movie/readMovie?id=5");
return rootView;
}
@Override
public void requestMovieList(String data) {
String url = data;
StringRequest request = new StringRequest(
Request.Method.GET,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
processResponse(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.getMessage();
}
}
);
request.setShouldCache(false);
AppHelper.requestQueue.add(request);
}
public void processResponse(String response) {
Gson gson = new Gson();
ResponseInfo info = gson.fromJson(response, ResponseInfo.class);
if (info.code == 200) {
MovieList movieList = gson.fromJson(response, MovieList.class);
if (movieList != null) {
MovieInfo movieInfo = movieList.result.get(0);
println(movieInfo.title);
}
}
}
public void println(String data) {
testText.append(data + "\n");
}
}
현재 상황은 이렇습니다
requestMovieList() 메소드에 응답 URL 을 String 값을 넣어줍니다
넘어온값을 Gson 으로 자바객체로 변환시킨뒤에 프래그먼트에 간단한 TextView 에 차례대로 영화 제목을 받아옵니다
println() 함수로 출력합니다
문제는 응답URL 의 영화 순서대로 꾼 -> 저스티스리그 -> 토르 -> 러빙빈센트 -> 범죄도시
순으로 나와야되는데 뒤죽박죽 엉망으로나옵니다
1 답변
-
비동기이므로 큐에 들어간 순서와 상관없이 응답이 빨리 받아진 순서로 리스트에 넣기 때문에 매 번 순서가 뒤죽박죽일 겁니다.
따로 라이브러리를 사용하실 것이 아니라면 취하실 수 있는 두 가지 방식이 있습니다.
1 . series 방식
하나의 응답을 받을 때마다 다음 요청을 실행하는 방식. 이 방식은 모든 결과를 얻기 전까지 일어나는 네트워킹의 모든 latency를 기다려야 하기 때문에 비효율적이긴 하지만 직관적입니다.
2 . parellel 방식
지금 작성하신 구조에서 자기 자신이 몇 번째 리퀘스트인지 계속해서 파라메터로 넘겨서 마지막에 다 받아지고 나면 이 값으로 sorting을 하거나 원하는 결과 배열의 인덱스에 직접 넣는 방식입니다. 모든 요청을 동시에 진행하기에 네트워크 소켓 pool이 충분하다면 5개 중에서 가장 오래 걸리는 요청만큼만 기다리면 됩니다.
댓글 입력