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");
}

}

현재 상황은 이렇습니다

  1. requestMovieList() 메소드에 응답 URL 을 String 값을 넣어줍니다

  2. 넘어온값을 Gson 으로 자바객체로 변환시킨뒤에 프래그먼트에 간단한 TextView 에 차례대로 영화 제목을 받아옵니다

  3. println() 함수로 출력합니다

    문제는 응답URL 의 영화 순서대로 꾼 -> 저스티스리그 -> 토르 -> 러빙빈센트 -> 범죄도시

    순으로 나와야되는데 뒤죽박죽 엉망으로나옵니다

  • 이곳은 질문/답변 사이트이지 무엇을 대행한다거나 하는 곳은 아닙니다. "그냥 안됩니다" 류의 내용으로는 답변이 달리기 힘듭니다. 정영훈 2019.9.23 10:05
  • 네 알겠습니다^^ sdf7895 2019.9.23 21:08

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    비동기이므로 큐에 들어간 순서와 상관없이 응답이 빨리 받아진 순서로 리스트에 넣기 때문에 매 번 순서가 뒤죽박죽일 겁니다.

    따로 라이브러리를 사용하실 것이 아니라면 취하실 수 있는 두 가지 방식이 있습니다.

    1 . series 방식

    하나의 응답을 받을 때마다 다음 요청을 실행하는 방식. 이 방식은 모든 결과를 얻기 전까지 일어나는 네트워킹의 모든 latency를 기다려야 하기 때문에 비효율적이긴 하지만 직관적입니다.

    2 . parellel 방식

    지금 작성하신 구조에서 자기 자신이 몇 번째 리퀘스트인지 계속해서 파라메터로 넘겨서 마지막에 다 받아지고 나면 이 값으로 sorting을 하거나 원하는 결과 배열의 인덱스에 직접 넣는 방식입니다. 모든 요청을 동시에 진행하기에 네트워크 소켓 pool이 충분하다면 5개 중에서 가장 오래 걸리는 요청만큼만 기다리면 됩니다.

    • 감사합니다 두개의 방식 충분히 공부하고 응용해서 해결하도록 하겠습니다^^ sdf7895 2019.9.23 21:07
    • 감사합니다!! 발리의 동기방식이 해결책이아니였습니다 알려주신 방식을 공부하다 문뜩 떠오른 설계방법으로 해결을 하였습니다 감사합니다! sdf7895 2019.9.25 01:36
    • 해결한 방법을 답글로 적어주시면 후학들에게 큰 도움이 될 듯 합니다. doodoji 2019.9.25 10:50
    • 네 알겠습니다 정리를해서 답글로 적어서 올리겠습니다! sdf7895 2019.9.25 20:14

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)