Utilisation de la fonction Call Enqueue dans Retrofit
Je suis en utilisant Retrofit-2.0.0
pour mon application. Maintenant, chaque tutoriel sur la Rénovation que j'ai trouvé sur le web est fondée sur les Retrofit
et il n'y avait pas Call<T>
interface. C'est la première fois que je suis à l'aide de Rénovation et je suis à plusieurs reprises d'obtenir null object reference
. Voici mon modèle de réseau de l'interface
public interface TMovieDBService {
@GET("/movie")
Call<MovieResponse> getMovieResponse(@Query("sort_by") String sortKey,
@Query("api_key") String apiKey);
}
Et c'est mon updateMovies()
fonction qui met à jour la liste des films.
void updateMovies() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.themoviedb.org/3/discover")
.addConverterFactory(GsonConverterFactory.create())
.build();
String sortKey = "popularity.desc";
TMovieDBService service = retrofit.create(TMovieDBService.class);
Call<MovieResponse> call = service.getMovieResponse(sortKey, ApiKey.API_KEY);
call.enqueue(new Callback<MovieResponse>() {
@Override
public void onResponse(Response<MovieResponse> response) {
Log.d(LOG_TAG, "Reached this place");
if (!response.isSuccess()) {
Log.d(LOG_TAG, "No Success");
}
mMovieList = response.body().getMovies(); //<- response is null here
//Log.d(LOG_TAG, "Couldn't not reach this place");
mMovieAdapter.notifyDataSetChanged();
Log.d(LOG_TAG, "Response returned by website is : " + response.code());
}
@Override
public void onFailure(Throwable t) {
//Toast for the moment
//Appropriate error handling code should be present here
Toast.makeText(getActivity(), "Failed !", Toast.LENGTH_LONG).show();
}
});
}
Je ne sais pas quoi mettre en œuvre dans la fonction de mise en file d'. Très peu est donné sur la rénovation du site web sur la façon d'utiliser la fonction de rappel. Supposons que tous les autres le code fonctionne bien. Ici MovieResponse
objet retourné par la movieDB API qui contient un tableau de Movie
s et quelques informations supplémentaires. Je suis la mise en œuvre d'une façon telle sorte qu'une fois que j'aurai la réponse dans MovieResponse
à partir de là, je peux extraire à l'aide de la getMovies()
qui sera de retour une liste de films.
Quand je le lance j'ai simplement obtenir null object reference
parce que response
est null. J'ai essayé de chercher des tutoriels sur l'utilisation de nouveaux Retrofit-2.0.0
en particulier sur l'utilisation de la fonction de mise en file d', mais je suis hors de la chance. Plus une question de savoir où doit updateMovies()
être appelé. Puis-je l'appeler directement dans le mainactivity. Ne de rénovation de lancer automatiquement l'appel du réseau sur le thread d'arrière-plan ?
source d'informationauteur AbKDs
Vous devez vous connecter pour publier un commentaire.
Avec la Rénovation 2,
onResponse
même si il est un échec. Vous avez vérifié si la réponse n'est pas réussie à l'aide de!response.isSuccess()
. Mais vous venez de vous identifier - si c'est vrai (c'est à dire pas de succès). Au lieu de cela, vous pourriez vous connecterresponse.errorBody().string()
pour voir si de l'api serveur spécifie l'erreur, et vous devriez appeler quelque chose commereturn
à la sortieonResponse
de rappel, commeresponse.body()
ne pouvait pas être castée pourMovieResponse
d'où l'exception de null.Par ailleurs, votre code est correct, mais si vous venez de commencer avec de Rénovation, il serait plus simple d'utiliser 1,9 version 2.0 est encore une version bêta (très stable, mais le manque de tutoriels).
Utiliser un Intercepteur de OkHttp Sur la Rénovation de 1,9 vous pouvez utiliser RequestInterceptor à l'interception d'une Demande, mais il est déjà retiré sur la Rénovation 2.0 depuis la connexion HTTP couche a été déplacé à OkHttp.
Comme un résultat, nous avons dû changer pour un Intercepteur de OkHttp à partir de maintenant.
Vous devez d'abord l'ajouter à construire.gradle
et puis créer un OkHttpClient objet avec un Intercepteur comme ceci:
Et passer ensuite le client créé en de Rénovation du Constructeur de la chaîne.
Supprimer " /" de votre @GET("/abc")
parce que la Rénovation 2.0 est livré avec la nouvelle URL résoudre concept. URL de Base et @Url n'ont pas tout simplement été combinées ensemble mais ont été résolus de la même manière que ce qui ne la place. Veuillez prendre un coup d'oeil aux exemples ci-dessous pour la clarification.
Pour en savoir plus à propos de de Rénovation 2.0
@AbKDs, je ne sais pas si vous avez déjà résolu, mais j'ai découvert après quelques difficultés avec la rénovation 2 que vous avez besoin de mettre "http://api.themoviedb.org" baseUrl et ajouter le chemin d'accès complet dans @OBTENIR. Comme ceci: @GET("/3/découvrir/movie")
Et puis vous ajoutez vos requêtes que les paramètres de votre interface d'Appel.