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'appelCall
Decancel
Mé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】