2017-01-31 2 views
0

그래서 세 개의 탭이 있으며 그 중 두 개의 탭에 개조 호출을해야합니다.세 개의 탭이있는 탭 레이아웃을 사용하는 경우 어떤 방법으로 추가 장착 호출을해야합니까?

나는 onCreateView 메서드에서 retrofit 호출이있는 메서드를 호출 해 보았습니다. onResponse 메서드에서받은 URL을 통해 이미지로드를 시도했습니다. 하지만 내 응용 프로그램을 디버깅 할 때 onResponse가 호출되기 전에도 onCreateView가 뷰를 반환합니다.

어떤 방법으로 단편에 추가 호출을해야합니까?

public class Tab3Fragment extends Fragment { 

private ImageView trailer_thumbnail; 
private static final String preImgUrl = "http://img.youtube.com/vi/"; 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.tab3_fragment, container, false); 
    trailer_thumbnail = (ImageView) rootView.findViewById(R.id.trailer_thumbnail); 
    updateTrailer(); 
    /*if(DetailsActivity.movieTrailerList.size() != 0) 
     Picasso.with(getContext()).load(preImgUrl + DetailsActivity.movieTrailerList.get(0).getKey() + "/default.jpg"). 
       placeholder(R.mipmap.ic_launcher). 
       error(R.mipmap.ic_launcher). 
       into(trailer_thumbnail);*/ 
    return rootView; 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
} 

private void updateTrailer(){ 
    final ProgressDialog mProgressDialog = new ProgressDialog(getContext()); 
    mProgressDialog.setIndeterminate(true); 
    mProgressDialog.setMessage("Loading..."); 
    mProgressDialog.show(); 
    Retrofit retrofit = new Retrofit.Builder(). 
      baseUrl(MainActivity.baseUrl). 
      addConverterFactory(GsonConverterFactory.create()). 
      build(); 

    final RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

    Call<MovieTrailerResponse> call1 = requestInterface.getMovieTrailers(list.get(index).getId(), MainActivity.apiKEy); 

    call1.enqueue(new Callback<MovieTrailerResponse>() { 
     @Override 
     public void onResponse(Call<MovieTrailerResponse> call, Response<MovieTrailerResponse> response) { 

      if (mProgressDialog.isShowing()) 
       mProgressDialog.dismiss(); 

      List<MovieTrailer> movieTrailerList = response.body().getResults(); 
      Log.i("trailer", preImgUrl + movieTrailerList.get(0).getKey() + "/default.jpg"); 

      if (movieTrailerList.get(0).getSite() == "YouTube") 
       Picasso.with(getActivity()).load(preImgUrl + movieTrailerList.get(0).getKey() + "/default.jpg"). 
         into(trailer_thumbnail); 
     } 

     @Override 
     public void onFailure(Call<MovieTrailerResponse> call, Throwable t) { 

     } 
    }); 

} 

이것은 내가 응용 프로그램을 디버깅하고 때, onCreateView 심지어 트레일러 탭이 선택되고 있으며, API 호출은 데이터를 수신하기 전에 뷰가 반환되기 전에 호출되고 내 tab3에 조각 클래스. 그래서 나는 progressdialog와 함께 이미지를로드 할 수 없습니다. 사실 tab2를 선택하면 진행 대화 상자가 표시됩니다.

+0

내 요구 사항에 따라 다릅니다.하지만 내 앱을 디버깅 할 때 onResponse가 호출되기 전에도 onCreateView가 뷰를 반환합니다. ' 그게 뭐가 문제 야? 너 정확히 뭘 하려구? – OBX

+0

api 호출에서받은 picasso URL을 사용하여 내 imageview를로드하려고하므로 onCreateView가 내 이미지 뷰가로드되기 전에 뷰를 반환합니다. – potter13

답변

0

당신은 에서 그것을 할 수는 방법을 onViewCreated, 난 당신이 onCreateView 방법 안에 제대로보기 주입을 가정하고 OnViewCreated 당신은 API 호출을 할 수 있으며, 개조의 onResponse 당신이 데이터를 사용할 수 있습니다 호출합니다.

+0

아니요, 앱을 디버깅 할 때이 문제가 해결되지 않습니다. , onCreateView는'onViewCreated'의 API 호출이 호출되기 전에 뷰를 반환하기 때문에 imageview는로드되지 않습니다. – potter13

+0

괜찮 으면,하지만 일단 API를 호출하면, Retrofit은 비동기식으로 작동합니다. 주 스레드. 데이터를 적절하게 얻은 경우, 재구성의 onSuccess 메소드에서 이미지를 표시 할 수 있습니다. – eminuluyol

+0

Picasa에서 제발 .placeholder와 drawable에서 하나의 이미지를 추가하려고합니다. 그래서 whe는 문제가 있는지 없는지를 볼 수 있습니다. – eminuluyol

1

Retrofit은 비동기 적으로 실행됩니다. 즉, UI 스레드 (메인 스레드)와는 별도로 실행됩니다. 다른 스레드에서 실행되는 Retrofit의 결과를 기다리고 있으므로 최상의 UI 연습은 Retrofit이 URL을 가져올 때까지 ProgressDialog을 실행하는 것입니다. 그런 다음 ProgressDialog을 닫고 Picasso을 사용하여 이미지를 렌더링 할 수 있습니다.

Picasso.with(context) 
.load(url) 
.placeholder(R.drawable.user_placeholder) 
.error(R.drawable.user_placeholder_error) 
.into(imageView); 

질문에 대한 답변을 오는, 정말 네트워크 호출이 응답을 가져까지 메인 스레드에서 대기하는 나쁜 관행이 될 것입니다 :로드 및 피카소와의 OnError 경우는 동안에도 자리 표시 자 이미지를 사용할 수 있습니다. 앞에서 언급 한 방법이 이상적입니다. 또한

하는 방법 나는 조각에 개조 전화를해야합니까?

onCreateView() 메서드에서 Retrofit 호출을 호출 할 수 있으며, 응답을받을 때까지 기다려야합니다. 희망이 도움이됩니다.

+0

제안한대로 진행률 대화 상자로 질문을 업데이트했습니다. – potter13

+0

지금은 무엇이 문제입니까? 앱을 디버깅 할 때 – OBX

+0

을 호출하면 API 호출이 데이터를 받기 전에 예고편 탭을 선택하기 전에 ('tab2를 선택하면 호출됩니다.') 뷰가 반환되기 전에도 'onCreateView'가 호출됩니다.그래서 나는 progressdialog와 함께 이미지를로드 할 수 없습니다. 사실 tab2를 선택하면 진행 대화 상자가 표시됩니다. android android-fragments retrofit – potter13