2017-01-31 5 views
0

私は3つのタブを持っていて、そのうちの2つのタブには改造呼び出しが必要です。3つのタブを持つタブレイアウトを使用している場合は、どの方法でレトロフィットコールを行う必要がありますか?

私は、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) { 

     } 
    }); 

} 

これは私のTAB3フラグメントクラスである私はアプリをデバッグしていたときにAPI呼び出しがデータを受信する前に、onCreateViewは、トレーラーのタブが選択されていて、ビューが返される前であっても呼ばれています。だから私はprogressdialogでもイメージを読み込むことができません。実際、タブ2を選択すると進捗ダイアログが表示されます。

+0

あなたの要求に依存しますが、私のアプリケーションをデバッグしているときに、onResponseが呼び出される前でもonCreateViewはビューを返しています。その問題は何ですか?あなたは正確に何をしようとしていますか? – OBX

+0

私のイメージビューを読み込む前に、onCreateViewがビューを返すように、私のイメージビューをpicassoを使ってurlでロードしようとしています。 – potter13

答えて

0

あなたはでそれを行うことができますが方法をonViewCreated、私はあなたがonCreateViewメソッド内で正しく表示注入を行うことを前提とし、その後、OnViewCreatedにあなたは、API呼び出しを行うことができますし、レトロフィットのonResponseには、データを使用することができます呼び出します。

+0

これは問題を解決していません。 'onViewCreated'のAPI呼び出しが呼び出される前でも' onCreateView'がビューを返していますので、imageviewはロードされません。 – potter13

+0

OKですが、一度行うとAPI呼び出しをしています、Retrofitは非同期で動作しますメインスレッドあなたがデータを適切に取得した場合、画像をRetrofitのonSuccessメソッドで表示することができます。 – eminuluyol

+0

ピカソでは、.placeholderとdrawableからの1つのイメージを追加しようとするので、wheは問題があるかどうかを確認することができます。 – eminuluyol

1

Retrofitは非同期に実行されます。つまり、UIスレッド(メインスレッド)とは別に実行されます。別のスレッドで実行されるRetrofitの結果を待っているため、RetrofitがURLを取得するまで、ProgressDialogを実行するのが最良のUIの方法です。その後、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

私はアプリをデバッグしているときに、 'onCreateView'は、APIの呼び出しがデータを受け取る前に、(tab2を選択すると呼び出されて)予告編タブが選択され、ビューが返される前に呼び出されています。だから私はprogressdialogでもイメージを読み込むことができません。実際、タブ2を選択すると進捗ダイアログが表示されます。 アンドロイドアンドロイド断片の改造 – potter13

関連する問題