android Volley + Gson 데이터전달에대하여 문의드립니다

조회수 981회
ArrayList<MovieDetailItem> movieDetailItems;
ArrayList<MovieSimpleItem> movieItems;
MoiveAdapter moiveAdapter;
ViewGroup rootView;
MovieInfo movieInfo;
String title;

    public View onCreateView(@NonNull LayoutLayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState )

    rootView = (ViewGroup) inflater.inflate(R.layout.moviepager, container, false);
    ViewPager viewpager = rootView.findViewById(R.id.moviepager);

    if (AppHelper.requestQueue == null) {
        AppHelper.requestQueue = Volley.newRequestQueue(getContext());
    }

    requestMovieList();

    movieItems = new ArrayList<>();
    movieItems.add(new MovieSimpleItem(R.drawable.image1, title));
    movieItems.add(new MovieSimpleItem(R.drawable.image2, "1.군 도"));
    movieItems.add(new MovieSimpleItem(R.drawable.image3, "1.군 도"));
    movieItems.add(new MovieSimpleItem(R.drawable.image4, "1.군 도"));
    movieItems.add(new MovieSimpleItem(R.drawable.image5, "1.군 도"));

    return rootView;
}



    public void requestMovieList() {
    String url = "http://" + AppHelper.host + ":" + AppHelper.port + "/movie/readMovieList";

    StringRequest request = new StringRequest(
            Request.Method.GET,
            url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    if(response != null) {
                        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 = movieList.result.get(0);
            title = movieInfo.title;
        }
    }

}

현재 상황은 이렇습니다

Volley + Gson 은 MainActivity 가 아닌 MoviePager 라는 Fragment 에 선언 정의 되어있습니다 Volley로 응답을 받아 processReponse(Strint response) 메소드에 response 를

매개변수로 넣어줍니다

받은 response 을 Gson 이용하여 자바객체로 변환시켜줍니다 변환시켜준 자바객체를 필드로 선언되어있는 String title 에 대입하고있습니다(title = movieInfo.title);

여기서 문제점이 발생합니다

Log 를 찍어보면 processReponse(Strint response) 에서는 문제없이 잘 찍힙니다

다만 movieInfo.title 값을 대입시킨 String title 값을
movieItems.add(new MovieSimpleItem(R.drawable.image1, title)); 이런식으로 대입해서 Bundle을 이용해 다른 Fragment로 데이터를 넘겨주려고하면 데이터가 안넘어갑니다

번들로 넘길때는 bundle.putSerializable 를 사용하고있습니다

processReponse(Strint response) 메소드에서는 전혀문제없던게

ArrayList에 대입해서 Bundle로 데이터를 넘기려고하면 왜 문제가 생기는지 궁금합니다

코드가 더 필요하다면 바로 올리겠습니다 이문제로 오랫동안고민하고있어서 정말 간절합니다

  • https://milkissboy.tistory.com/34 일단 여기 참조해보시고요.....문제가 잘 이해가 안되는데 Fragment에서 object의 값을 못 읽는 다는 건지 object는 넘어갔는데 안의 값이 안 나온다는 건지.... 알 수 없는 사용자 2019.9.18 10:20
  • 먼저 답변달아주셔서 감사합니다! 문제는 processResponse 메소드 안에서는 movieInfo.title 로그가 잘찍힙니다 문제는 title = movieInfo.title; 로 대입을해서 onCreateView 에서 movieItems.add() 로 title 을 추가했을때는 다시 널값이 뜹니다.. sdf7895 2019.9.18 10:53
  • 먼저 알려주신 티스토리 정보는 감사합니다 보고 적용시켜봤는데 데이터가안넘어갑니다ㅠㅠ sdf7895 2019.9.18 10:59
  • 순서가 잘못 된것은 아닌지 의심 됩니다. 로그를 processResponse() 함수에서 title 값을 찍어보고 movieItems.add() 함수에서 title 값을 찍어 보시기 바랍니다. onCreateView() 함수에서 먼저 찍힐 것 같은데...그럼 Null 일 수 밖에 없죠 알 수 없는 사용자 2019.9.18 11:05
  • onCreateView() 에서 Log.d()를 title 값으로 찍으면 어플이 바로 죽어버립니다..혹시 이것도 순서와 관련이있을까요? sdf7895 2019.9.18 11:08
  • 그렇다면 title 선언한 부분에 임의의 값으로 "test"를 입력하고 다시 찍어 보시기 바랍니다...그래도 앱이 죽는다면 그냥 Log.d("test"); 라고만 찍으셔도 됩니다... 중요한 건 호출 순서를 보기 위함 이니까요 알 수 없는 사용자 2019.9.18 11:10
  • 맞습니다 태평님.. onCreateView 에서 먼저 찍히고있었습니다.. sdf7895 2019.9.18 11:20
  • Volley 가 비동기처리방식이여서 이런문제가 발생한걸까요??.. sdf7895 2019.9.18 11:24
  • 흠...제 생각에는 String Request라는 것이 async로 동작하는 게 아닌가 싶은데요...이럴 경우에는 Response가 언제 들어올지 모릅니다. 그리고 onCreateView() 라는 함수는 뷰를 만드는 함수 일텐데 먼저 불릴 것 같긴 합니다..processResponse() 함수에서 title 값을 받았을 때 movieItems에 add 하는 것은 어떨까요? 어쨌든 Response를 받고 난 뒤에 데이터를 넘겨줘야 할 것 같네요 알 수 없는 사용자 2019.9.18 11:25
  • 추가적으로 ViewPager를 쓰신다 하니 비동기를 위한 업데이트 함수가 존재할 겁니다. adapter인가 뭔가로 했던 것 같은데....한번 찾아보시면 좋을 것 같아요 알 수 없는 사용자 2019.9.18 11:29
  • title 값을 받고 processResponse()메소드안에서 movieItems.add 처리를 하라는 말씀이신가요??ㅎㅎ sdf7895 2019.9.18 11:29
  • 네 맞습니다.. 정확히 어떤 표현을 하려는 건지는 알 수 없지만 비동기 처리를 해서 UI에 보여 주기 위한 방법은 Response를 받은 뒤에 update() 함수를 호출 해주는 방식을 씁니다 알 수 없는 사용자 2019.9.18 11:30
  • 태평님 위에 코드 추가했습니다 한번봐주실수있으실까요? 저런식으로 프래그먼트를 새로만들어서 하나의 프래그먼트를 재활용하면서 Bundle로 값을 넘겨주고있습니다 sdf7895 2019.9.18 11:32
  • ㅎㅎㅎ 저 것도 왠지 값이 안 넘어 갈 듯 한데요...제 말은 Response를 받고 그곳에서 다른 함수를 호출하여 업데이트를 하라는 것이었습니다. onCreateView() 함수에서 처리해 버리면 이전 상황이랑 같지 않을까요? 정리해 드리자면, onCreateView() : 변수 초기화 및 뷰 초기화에 필요한 작업, Response() : 수신한 데이터 저장 및 전달 알 수 없는 사용자 2019.9.18 11:36
  • https://www.krishandev.com/android-image-slider-using-viewpager-and-volley/ 무엇을 구현 하시려는 지는 잘 모르겠지만 참고해 보세요 알 수 없는 사용자 2019.9.18 11:38
  • 태평님이 먼저 참고해보라구 올려주신 링크를 못보고 제가 이상한 댓글을 달았네요 업데이트예제 부탁드린 댓글은 삭제했습니다 ! 태평님이 알려주신 사이트 참고해보고 고민해서 다시 코드 수정하겠습니다 혹시라도 막히면 다시한번 부탁드리겠습니다 감사합니다 태평님! sdf7895 2019.9.18 11:56
  • 태평님 감사합니다 해결하였습니다 고맙습니다! sdf7895 2019.9.19 07:54

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

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

(ಠ_ಠ)
(ಠ‿ಠ)