编程知识 cdmana.com

Tutoriel de démarrage Android | okhttp + Retrofit comment annuler une demande

Dans une interface,L'utilisateur a lancé une demande de réseau,Pour une raison ou une autre, l'utilisateur a quitté l'interface actuelle avant que la demande de réseau ne soit terminée,Il est préférable d'annuler cette demande de réseau.Comment trouver cette demande de réseau et l'annuler?

Préface

Dans une interface,L'utilisateur a lancé une demande de réseau,Pour une raison ou une autre, l'utilisateur a quitté l'interface actuelle avant que la demande de réseau ne soit terminée,Il est préférable d'annuler cette demande de réseau.Pour OkHttp Dis,Plus précisément, l'appelCallDecancelMéthodes.

Comment trouver cette demande de réseau et l'annuler?

Les opérations sont généralement divisées en3Pas:

  • Première étape,Lors de l'établissement de la demande,Demande(request)Ajouter un marqueur;
  • Deuxième étape,Selon le marquage,Trouver la demande;
  • Enfin,Annuler cette demande.

OkHttpDanstag

Pour annuler une demande,OkHttpPeut être utilisé dans cancel Méthodes.

OkHttp De request Les objets ont tag.Peut être basé surtagPour marquer la demande..

//Set tags for your requests when you build them:
    Request request = new Request.Builder().
    url(url).tag("requestKey").build();

    //When you want to cancel:
    //A) go through the queued calls and cancel if the tag matches:
    for (Call call : mHttpClient.dispatcher().queuedCalls()) {
        if (call.request().tag().equals("requestKey"))
            call.cancel();
    }

    //B) go through the running calls and cancel if the tag matches:
    for (Call call : mHttpClient.dispatcher().runningCalls()) {
        if (call.request().tag().equals("requestKey"))
            call.cancel();
    }

Retrofit L'interface pour annuler la demande n'est pas affichée dans . Comment trouver la demande de réseau cible ?

Retrofit Ajouter une personnalisation header

Pour chaque page (Activity,Fragment)Questions connexes request Ajouter une personnalisation header. Voilà. OkHttpClientAjouter un intercepteur. Marquer l'état de vie de la page . Si la page est détruite , Alors annulez request.

Par GithubOnAndroid Exemples de projets

Ajouter un marqueur

Tenir un ConcurrentHashMap Pour marquer l'état de survie de la page .

private static ConcurrentHashMap<String, Boolean> actLiveMap = new ConcurrentHashMap<>(); // MarquageActivitySurvie ou non

    public static void markPageAlive(String actName) {
        actLiveMap.put(actName, true);
    }

    public static void markPageDestroy(String actName) {
        actLiveMap.put(actName, false);
    }
Activity Enregistrer l'état de l'interface dans

Pour le moment Activity Nom..Chaque Activity Le tagname doit être unique .

private static final String MY_ACT_NAME = "xxx1Activity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        NetworkCenter.markPageAlive(MY_ACT_NAME);
        // ...
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        NetworkCenter.markPageDestroy(MY_ACT_NAME);
        // ...
    }
OkHttpClient Ajouter un intercepteur

Voilà. OkHttpClient Ajouter un intercepteur, Vérifiez la survie de la page dans l'intercepteur . Après inspection, Personnalisez ça headerSupprimer.

public static final String HEADER_ACT_NAME = "Activity-Name"; // MarquageActivity Nom de l'interface 

    private Interceptor lifeInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            String actName = request.header(HEADER_ACT_NAME);
            if (!TextUtils.isEmpty(actName)) {
                Log.d(TAG, "lifeInterceptor: actName: " + actName);
                Boolean actLive = actLiveMap.get(actName);
                if (actLive == null || !actLive) {
                    chain.call().cancel();
                    Log.d(TAG, "lifeInterceptor: Demande d'annulation, actName: " + actName);
                } else {
                    Log.d(TAG, "lifeInterceptor: Demande d'initiation, actName: " + actName);
                }
            }
            Request newRequest = request.newBuilder().removeHeader(HEADER_ACT_NAME).build();
            return chain.proceed(newRequest);
        }
    };

OkHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .addInterceptor(lifeInterceptor) // Ajouter un intercepteur
        .build();

call.cancel() Après, Ne pars plus Retrofit De subscribe Méthodes.

Ajouter header
@GET("users/{owner}/repos")
    Observable<List<UserRepo>> userRepo(
            @Header(NetworkCenter.HEADER_ACT_NAME) @Nullable String actName,
            @Path("owner") String owner,
            @Query("sort") String sortType);

AndroidDéveloppement:Frame Source Analysis Video Reference

版权声明
本文为[Android Yasuko.]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/11/20211125180118170y.html

Scroll to Top