2017-01-31 12 views
0

Итак, у меня есть три вкладки, и на двух из этих вкладок я должен сделать переадресацию вызовов.В каком методе я должен делать перенастройку, если я использую вкладку с тремя вкладками?

Я пробовал методы вызова, которые имеют модификационные вызовы в методе onCreateView. В методе onResponse я попытался загрузить изображение через полученный URL. Но когда я отлаживаю свое приложение, onCreateView возвращает представление, даже до вызова функции onResponse.

В каком методе я должен сделать повторные вызовы в фрагменте?

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, когда я отладки приложения, onCreateView вызывается еще до вкладки прицепов выбирают и вид возвращается, прежде чем вызов апи принимает данные. Поэтому я не могу загрузить изображение даже с помощью progressdialog. На самом деле индикатор прогресса отображается, когда я выбираю tab2.

+0

Это зависит от вашего требования. 'Но когда я отлаживаю свое приложение, onCreateView возвращает представление, даже до того, как onResponse будет вызван'. В чем проблема? Что именно ты пытаешься сделать? – OBX

+0

Я пытаюсь загрузить мое изображение с url (используя picasso), полученное от вызова api, поэтому onCreateView возвращает представление, даже до загрузки моего изображения – potter13

ответ

0

Вы можете сделать это в onViewCreated метод, я предполагаю, что вы делаете инъекции правильно просмотра внутри метода onCreateView, то в OnViewCreated вы можете сделать апи вызов и в onResponse модернизированных звонка можно использовать данные.

+0

Нет, это не решает проблему, когда я отлаживаю приложение , 'onCreateView' возвращает представление, даже до вызова вызова api в' onViewCreated', поэтому изображение не загружается – potter13

+0

ОК, но вы выполняете вызов api, как только вы это сделаете, Retrofit работает как асинхронный, а не в основной поток. Если вы получите свои данные пропущенно, вы можете показать изображение в методе onSuccess для «Дооснащения». – eminuluyol

+0

Пожалуйста, в Picasso попробуйте добавить также .placeholder и одно изображение из вашего рисунка, так что вы можете увидеть, что если возникнут какие-либо проблемы или нет. – eminuluyol

1

Retrofit работает асинхронно, что означает, что он работает отдельно от потока пользовательского интерфейса (основной поток). Поскольку вы ожидаете результата от Retrofit, который работает в другом потоке, лучшей практикой UI будет запуск ProgressDialog, пока Retrofit не выберет URL. Затем вы можете отклонить ProgressDialog и сделать изображение с помощью Picasso. Вы также можете использовать шаблонные изображения при загрузке и OnError случаи с Пикассо:

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

Coming к ответу на ваш вопрос, это будет действительно плохая практика, чтобы ждать от основного потока до сетевого вызова получает ответ. Вышеупомянутый путь был бы идеальным.

Кроме того,

В какой метод я должен сделать модернизированных вызовы в фрагменте?

Вы можете вызвать Retrofit вызов из onCreateView() метода, опять же вам нужно ждать, пока вы получите ответ. Надеюсь, поможет.

+0

Я обновил вопрос с диалоговым окном прогресса, как вы предложили – potter13

+0

Теперь, в чем проблема? – OBX

+0

Когда я отлаживаю приложение, 'onCreateView' вызывается еще до того, как была выбрана вкладка трейлеров (она вызывается, когда я выбираю tab2), и представление возвращается, прежде чем вызов api получит данные.Поэтому я не могу загрузить изображение даже с помощью progressdialog. На самом деле индикатор прогресса отображается, когда я выбираю tab2. модифицированные андроиды-фрагменты – potter13