2017-01-31 3 views
0

Also habe ich drei Registerkarten und in zwei dieser Registerkarten muss ich nachrüsten.In welcher Methode soll ich nachrüsten, wenn ich Tab-Layout mit drei Tabs verwende?

Ich habe versucht, Methoden aufzurufen, die Retrofit-Aufrufe in OnCreateView-Methode haben. In OnResponse-Methode habe ich versucht, Bild durch die URL empfangen zu laden. Aber wenn ich meine App debugge, gibt die onCreateView die Ansicht zurück, noch bevor onResponse aufgerufen wird.

In welcher Methode soll ich Nachrüstaufrufe in Fragment machen?

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) { 

     } 
    }); 

} 

Das ist mein tab3 Fragment Klasse, wenn ich die app bin Debuggen onCreateView noch bevor Anhänger Tab aufgerufen wird, wird ausgewählt und die Ansicht zurückgegeben wird, bevor der API-Aufruf die Daten empfängt. So kann ich das Bild auch mit progressdialog nicht laden. Tatsächlich wird Fortschrittsdialog angezeigt, wenn ich Tab2 wähle.

+0

Es hängt von Ihrer Anforderung ab. "Aber wenn ich meine App debugge, gibt die onCreateView die Ansicht zurück, noch bevor onResponse aufgerufen wird". Was ist das Problem damit? Was genau versuchst du zu tun? – OBX

+0

Ich versuche, meine Bildansicht mit URL (mit Picasso) von API Aufruf geladen, so dass die onCreateView die Ansicht zurückgibt, noch bevor meine Bildansicht geladen wird – potter13

Antwort

0

Sie können es in onViewCreated Methode, nehme ich an, dass Sie richtig in die onCreateView Methode Ansicht Injektion tun, dann in OnViewCreated können Sie API-Aufruf und in onResponse von Retrofit nennen wollen Sie die Daten verwenden können.

+0

Nein, das löst nicht das Problem, wenn ich die App debuggen , die 'onCreateView' gibt die Ansicht zurück, noch bevor der API Aufruf in' onViewCreated' aufgerufen wird, also wird imageview nicht geladen – potter13

+0

OK, aber Sie tun den API Aufruf, sobald Sie es tun, funktioniert Retrofit async, nicht in der Hauptfaden. Wenn Sie Ihre Daten zu einem bestimmten Zeitpunkt erhalten, können Sie das Bild in der onSuccess-Methode von Retrofit anzeigen. – eminuluyol

+0

Bitte in Picasso versuchen, auch .Placeholder und ein Bild von Ihrem Zeichen hinzufügen, so dass, wenn irgendein Problem oder nicht sehen kann. – eminuluyol

1

Retrofit läuft asynchron, was bedeutet, dass es separat vom UI-Thread (Haupt-Thread) ausgeführt wird. Da Sie auf das Ergebnis von Retrofit warten, das auf einem anderen Thread ausgeführt wird, wäre die beste UI-Übung, eine ProgressDialog auszuführen, bis Retrofit die URL abruft. Dann können Sie die ProgressDialog ablehnen und das Bild mit Picasso rendern. Sie können auch Platzhalter Bilder beim Laden und onError Fälle mit Picasso verwenden:

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

kommend auf die Antwort auf Ihre Frage, wäre es wirklich eine schlechte Praxis von dem Haupt-Thread zu warten, bis das Netzwerk Anruf eine Antwort abruft. Der oben genannte Weg wäre ideal.

Auch

In dem Verfahren soll ich machen Retrofit Anrufe in Fragmente?

Sie sind frei, die Retrofit Anruf von onCreateView() Methode aufzurufen, wieder würden Sie, bis Sie eine Antwort erhalten zu warten. Ich hoffe es hilft.

+0

Ich habe die Frage mit Fortschrittsdialog aktualisiert, wie Sie vorgeschlagen haben – potter13

+0

Nun, was ist das Problem? – OBX

+0

Wenn ich die App debuggen, wird 'onCreateView' aufgerufen, noch bevor Anhänger-Registerkarte ausgewählt wird (es wird aufgerufen, wenn ich Tab2) und die Ansicht zurückgegeben wird, bevor der API-Anruf die Daten empfängt.So kann ich das Bild auch mit progressdialog nicht laden. Tatsächlich wird Fortschrittsdialog angezeigt, wenn ich Tab2 wähle. android android-fragmente nachrüsten – potter13

Verwandte Themen