RxJava+Retrofit使用,kotlinmap函数
onError(ThrowableHandler.handleThrowable(throwable));
} else {
onError(new HttpThrowable(HttpThrowable.UNKNOWN, “未知错误”, throwable));
}
}
//应用中具体实现的是下面这个onError方法
public void onError(HttpThrowable httpThrowable) {
Toast.makeText(AppGlobals.getApplication().getApplicationContext(),
httpThrowable.message, Toast.LENGTH_LONG).show();
}
}
- 请求后台访问数据的接口类
/**
- 请求后台访问数据的接口类
*/
public interface ServiceApi {
/**
- Get方法 @Query
*/
@GET(“home/paintingList”)
Observable<Result> getSearchContent(@Query(“searchContent”) String text, @Query(“size”) int size);
/**
- Get方法 @Query
*/
@GET(“home/paintingList”)
Observable<Result> getSearchContent2(@Query(“searchContent”) String text, @Query(“size”) int size);
@POST(“applets/code2Session”)
Observable<Result> postCode2Session(@Body Map<String, Object> code);
}
- BaseActivity中绑定生命周期
public abstract class BaseActivity extends AppCompatActivity {
/**
- 绑定生命周期
*/
protected LifecycleProvider<Lifecycle.Event> rxLifecycle = AndroidLifecycle.createLifecycleProvider(this);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
- 调用
package cc.network.rxjava;
import android.content.Intent;
import android.nfc.Tag;
import android.os.Bundle;
import android.util.ArrayMap;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import androidx.lifecycle.Lifecycle;
import com.alibaba.fastjson.JSON;
import com.yumakeji.rxjava.network.RetrofitClient;
import com.yumakeji.rxjava.network.bean.Result;
import com.yumakeji.rxjava.network.callback.ConsumerCallback;
import com.yumakeji.rxjava.network.callback.ObserverCallback;
import com.yumakeji.rxjava.network.callback.ThrowableCallback;
import com.yumakeji.rxjava.network.error.HttpThrowable;
import com.yumakeji.rxjava.network.handler.RetryWithDelay;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import cc.network.rxjava.rxjava.ServiceApi;
import cc.network.rxjava.textbean.LoginBean;
import cc.network.rxjava.textbean.Top250Bean;
import cc.network.rxjava.viewmodel.RxjavaViewModel;
import cn.yumakeji.jetpackroomstudy.R;
import cn.yumakeji.lib_common.global.AppGlobals;
import cn.yumakeji.lib_common.utils.AppUtils;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import io.reactivex.rxjava3.core.ObservableOnSubscribe;
import io.reactivex.rxjava3.core.ObservableSource;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Action;
import io.reactivex.rxjava3.functions.BiFunction;
import io.reactivex.rxjava3.functions.Consumer;
import io.reactivex.rxjava3.functions.Function;
import io.reactivex.rxjava3.schedulers.Schedulers;
/**
-
防止多次点击
-
https://www.jianshu.com/p/ea45670a364f,
-
-
Retrofit
-
https://blog.csdn.net/huangxiaoguo1/article/details/65627293
-
-
Rxjava
-
https://www.jianshu.com/p/092452f287db
-
不继承RxAppCompatActivity的情况下使用RxLifeCycle
-
https://blog.csdn.net/kevinscsdn/article/details/78980010
*/
public class RxjavaActivity extends BaseActivity {
private ListView mListView;
private List strings = new CopyOnWriteArrayList<>();
private final String TAG = “Rxjava”;
private RxjavaViewModel viewModel;
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
getLifecycle().removeObserver(viewModel);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rxjava);
mListView = findViewById(R.id.list_item);
strings.add("Get方法 @Query ");
strings.add("Post方法 @Body ");
strings.add(“使用Rxjava切换线程”);
strings.add(“Rxjava(一)emitter”);
strings.add(“Rxjava(二)变换操作符Map”);
strings.add(“Rxjava(三)FlatMap”);
strings.add(“Rxjava(四)concatMap”);
strings.add(“Rxjava(五)接口顺序调用”);
strings.add(“Rxjava(六)接口顺序调用(内部发生错误)”);
strings.add(“Rxjava(七)Zip来打包”);
}
/**
-
去体验Retrofit
-
@param view
*/
public void onRetrofitClick(View view) {
startActivity(new Intent(this, RetrofitActivity.class));
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
viewModel = new RxjavaViewModel(this);
getLifecycle().addObserver(viewModel);
mListView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, strings));
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0://Get方法 @Query
RetrofitClient.getInstance()
.create(ServiceApi.class)// 创建服务
.getSearchContent("", 5)//调用接口
.subscribeOn(Schedulers.io())// 指定被观察者的操作在io线程中完成
.doOnSubscribe(disposable -> viewModel.showProgressDialog(“正在请求中”))
.observeOn(AndroidSchedulers.mainThread())//指定观察者接收到数据,然后在Main线程中完成
.retryWhen(new RetryWithDelay(1, 1))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
.doAfterTerminate(() -> viewModel.hintProgressDialog())
.compose(rxLifecycle.bindUntilEvent(Lifecycle.Event.ON_DESTROY))//生命周期
.subscribe(new ConsumerCallback() {
@Override
public void onSucceed(Top250Bean result) {
// 成功获取数据
Toast.makeText(AppGlobals.getApplication().getApplicationContext(),
“成功了” + result, Toast.LENGTH_LONG).show();
}
@Override
public void onError(int code, String msg) {
// 获取数据失败
Toast.makeText(AppGlobals.getApplication().getApplicationContext(),
msg, Toast.LENGTH_LONG).show();
}
}, new ThrowableCallback() {
@Override
public void onError(HttpThrowable httpThrowable) {
// 获取数据失败
Log.i(TAG, httpThrowable.message);
}
});
break;
case 1://POST方法 @Body
ArrayMap<String, Object> map = new ArrayMap<>();
map.put(“jsCode”, “033sHaaK03pRwa2Bic9K0EmcaK0sHaaq”);
RetrofitClient.getInstance()
.create(ServiceApi.class)
.postCode2Session(map)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> viewModel.showProgressDialog(“正在请求中”))
.observeOn(AndroidSchedulers.mainThread())
.compose(rxLifecycle.bindUntilEvent(Lifecycle.Event.ON_DESTROY))
.retryWhen(new RetryWithDelay(1, 1))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
.doAfterTerminate(() -> viewModel.hintProgressDialog())
.subscribe(new ObserverCallback() {
@Override
public void onSucceed(LoginBean result) {
// 成功获取数据
Toast.makeText(AppGlobals.getApplication().getApplicationContext(),
“成功了” + result, Toast.LENGTH_LONG).show();
}
@Override
public void onFail(int code, String msg) {
// 获取数据失败
Toast.makeText(AppGlobals.getApplication().getApplicationContext(),
msg, Toast.LENGTH_LONG).show();
}
@Override
public void onComplete() {
super.onComplete();
}
});
break;
case 2://使用Rxjava切换线程
Observable.empty().observeOn(Schedulers.io())
.doOnComplete(new Action() {
@Override
public void run() throws Throwable {
Log.i(TAG, “我是子线程:” + AppUtils.isMainThread());
Observable.timer(3, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnComplete(() -> msgManagement(10))
.subscribe();
Observable.empty().observeOn(AndroidSchedulers.mainThread())
.doOnComplete(() -> msgManagement(20)
).subscribe();
}
}).subscribe();
break;
case 3:
//Rxjava(一)emitter 发射器
/**
-
借鉴:给初学者的RxJava2.0教程(一)
-
https://www.jianshu.com/p/464fa025229e
-
规则:
-
1、上游可以发送无限个onNext, 下游也可以接收无限个onNext.
-
2、当上游发送了一个onComplete后, 上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件.
-
3、当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件.
-
4、上游可以不发送onComplete或onError.
-
5、最为关键的是onComplete和onError必须唯一并且互斥, 即不能发多个onComplete, 也不能发多个onError,
-
也不能先发一个onComplete, 然后再发一个onError, 反之亦然
-
注: 关于onComplete和onError唯一并且互斥这一点, 是需要自行在代码中进行控制, 如果你的代码逻辑中违背了这个规则,
-
**并不一定会导致程序崩溃. ** 比如发送多个onComplete是可以正常运行的, 依然是收到第一个onComplete就不再接收了,
-
但若是发送多个onError, 则收到第二个onError事件会导致程序会崩溃.
*/
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable {
Log.e(TAG, “是否是主线程=>” + AppUtils.isMainThread());
emitter.onNext(“huangxiaoguo1”);
emitter.onNext(“huangxiaoguo2”);
emitter.onNext(“huangxiaoguo3”);
emitter.onComplete();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
private Disposable mDisposable;
/**
-
不带任何参数的subscribe() 表示下游不关心任何事件,你上游尽管发你的数据去吧, 老子可不管你发什么.
-
带有一个Consumer参数的方法表示下游只关心onNext事件, 其他的事件我假装没看见,
-
@param d
*/
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.d(TAG, “subscribe”);
mDisposable = d;
}
@Override
public void onNext(@NonNull String s) {
/**
-
当调用它的dispose()方法时, 它就会将两根管道切断, 从而导致下游收不到事件.
-
调用dispose()并不会导致上游不再继续发送事件, 上游会继续发送剩余的事件
*/
Log.e(TAG, “onNext 是否是主线程 ==>” + AppUtils.isMainThread());
Log.d(TAG, “onNext==>” + s);
if (s.equals(“huangxiaoguo2”)) {
mDisposable.dispose();
}
}
@Override
public void onError(@NonNull Throwable e) {
Log.d(TAG, “onError”);
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete ");
}
});
break;
case 4:
//Rxjava(二)变换操作符Map
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable {
Log.e(TAG, “subscribe 是否是主线程 ==>” + AppUtils.isMainThread());
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
}
})
.subscribeOn(Schedulers.io())
.map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Throwable {
Log.e(TAG, “map 是否是主线程 ==>” + AppUtils.isMainThread());
return “我是在map中处理过了的===>” + String.valueOf(integer);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(String s) throws Throwable {
Log.e(TAG, “accept 是否是主线程 ==>” + AppUtils.isMainThread());
Log.i(TAG, “accept===>” + s);
}
});
break;
case 5:
//flatMap 并不保证事件的顺序
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
}
}).flatMap(new Function<Integer, ObservableSource>() {
@Override
public ObservableSource apply(Integer integer) throws Throwable {
ArrayList strings = new ArrayList<>();
for (int i = 0; i < 3; i++) {
strings.add("I am value " + integer);
}
return Observable.fromIterable(strings).delay(2, TimeUnit.SECONDS);
}
}).subscribe(new Consumer() {
@Override
public void accept(String s) throws Throwable {
Log.d(TAG, s);
}
});
break;
case 6:
//concatMap 保证顺序
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
}
}).concatMap(new Function<Integer, ObservableSource>() {
@Override
public ObservableSource apply(Integer integer) throws Throwable {
ArrayList strings = new ArrayList<>();
for (int i = 0; i < 3; i++) {
strings.add("I am value " + integer);
}
return Observable.fromIterable(strings).delay(2, TimeUnit.SECONDS);
}
}).subscribe(new Consumer() {
@Override
public void accept(String s) throws Throwable {
Log.d(TAG, s);
}
});
break;
case 7:
//Rxjava(五)接口顺序调用
RetrofitClient.getInstance()
.create(ServiceApi.class)// 创建服务
.getSearchContent("", 5)//调用接口
.subscribeOn(Schedulers.io())// 指定被观察者的操作在io线程中完成
.doOnSubscribe(disposable -> viewModel.showProgressDialog(“正在请求中”))
.observeOn(AndroidSchedulers.mainThread())//指定观察者接收到数据,然后在Main线程中完成
.doOnNext(new ConsumerCallback() {
@Override
public void onSucceed(Top250Bean result) {
Log.e(TAG, result.toString());
}
@Override
public void onError(int code, String msg) {
}
})
.observeOn(Schedulers.io())
.flatMap(new Function<Result, Observable<Result>>() {
@Override
public Observable<Result> apply(Result result) throws Throwable {
Log.e(TAG, result.getMessage());
ArrayMap<String, Object> map = new ArrayMap<>();
map.put(“jsCode”, “033sHaaK03pRwa2Bic9K0EmcaK0sHaaq”);
return RetrofitClient.getInstance().create(ServiceApi.class).postCode2Session(map);
}
})
.retryWhen(new RetryWithDelay(1, 1))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
.compose(rxLifecycle.bindUntilEvent(Lifecycle.Event.ON_DESTROY))//生命周期
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> viewModel.hintProgressDialog())
.subscribe(new ConsumerCallback() {
@Override
public void onSucceed(LoginBean result) {
Log.e(TAG, result.toString());
}
@Override
public void onError(int code, String msg) {
Log.e(TAG, msg);
}
}, new ThrowableCallback() {
@Override
public void onError(HttpThrowable httpThrowable) {
super.onError(httpThrowable);
}
});
break;
case 8:
//Rxjava(六)接口顺序调用(内部发生错误)
ArrayMap<String, Object> map1 = new ArrayMap<>();
map1.put(“jsCode”, “033sHaaK03pRwa2Bic9K0EmcaK0sHaaq”);
RetrofitClient.getInstance()
.create(ServiceApi.class)// 创建服务
.postCode2Session(map1)//调用接口
.subscribeOn(Schedulers.io())// 指定被观察者的操作在io线程中完成
.doOnSubscribe(disposable -> viewModel.showProgressDialog(“正在请求中”))
.observeOn(AndroidSchedulers.mainThread())//指定观察者接收到数据,然后在Main线程中完成
.doOnNext(new ConsumerCallback() {
@Override
public void onSucceed(LoginBean result) {
Log.e(TAG, result.toString());
}
@Override
public void onError(int code, String msg) {
Log.e(TAG, msg);
}
})
.observeOn(Schedulers.io())
.flatMap(new Function<Result, Observable<Result>>() {
@Override
public Observable<Result> apply(Result result) throws Throwable {
if (!result.isOk()) {
return null;
}
return RetrofitClient.getInstance().create(ServiceApi.class).getSearchContent("", 5);
}
})
.retryWhen(new RetryWithDelay(1, 1))//遇到错误时重试,第一个参数为重试的间隔,第二个参数为重试几次
.compose(rxLifecycle.bindUntilEvent(Lifecycle.Event.ON_DESTROY))//生命周期
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> viewModel.hintProgressDialog())
.subscribe(new ConsumerCallback() {
@Override
public void onSucceed(Top250Bean result) {
Log.e(TAG, result.toString());
}
@Override
public void onError(int code, String msg) {
Log.e(TAG, msg);
}
}, new ThrowableCallback() {
@Override
public void onError(HttpThrowable httpThrowable) {
super.onError(httpThrowable);
}
});
break;
case 9:
//Rxjava(七)Zip来打包请求
Observable.zip(RetrofitClient.getInstance()
.create(ServiceApi.class)
.getSearchContent("", 1)
.subscribeOn(Schedulers.io()),
RetrofitClient.getInstance()
.create(ServiceApi.class)
.getSearchContent2("", 1)
.subscribeOn(Schedulers.io()),
new BiFunction<Result, Result, Top250Bean>() {
@Override
public Top250Bean apply(Result result, Result result2) throws Throwable {
Top250Bean data1 = JSON.parseObject(JSON.toJSONString(result.data), Top250Bean.class);
Top250Bean data2 = JSON.parseObject(JSON.toJSONString(result.data), Top250Bean.class);
data1.getRecords().addAll(data2.getRecords());
return data1;
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(Top250Bean result) throws Throwable {
Log.e(TAG, result.toString());
Log.e(TAG, result.getRecords().size()+"—");
}
});
break;
}
}
});
}
/**
-
代替Handler
-
@param what
*/
private void msgManagement(int what) {
if (what == 10) {
Log.i(TAG, “我是代替Handler 有延时” + AppUtils.isMainThread());
} else {
Log.i(TAG, “我是代替Handler 没有延时” + AppUtils.isMainThread());
}
}
}
- MVVM中管理Rxjava的生命周期
可直接使用开源框架:rxjava-RxLife
//使用rxlife对viewModel生命周期执行支持(rxlifecycle在google jetpack的videModel中不太好用,针对的是MVP)
api ‘com.ljx.rxlife3:rxlife-rxjava:3.0.0’
注意: 一定要在Activity/Fragment通过以下方式获取ViewModel对象,否则RxLife接收不到生命周期的回调
viewModel = new ViewModelProvider(this).get(RxjavaViewModel.class);
Observable.interval(2, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.to(RxLife.to(this))
.subscribe(new Consumer() {
@Override
public void accept(Long aLong) throws Throwable {
Log.e(“huangxiaoguo”, “接口轮询”);
}
});
其他设计到的类
- error
package com.yumakeji.rxjava.network.error;
public class HttpThrowable extends Exception {
public int errorType;
public String message;
public Throwable throwable;
/**
- 未知错误
*/
public static final int UNKNOWN = 1000;
/**
- 解析错误
*/
public static final int PARSE_ERROR = 1001;
/**
- 连接错误
*/
public static final int CONNECT_ERROR = 1002;
/**
- DNS解析失败(无网络)
*/
public static final int NO_NET_ERROR = 1003;
/**
- 连接超时错误
*/
public static final int TIME_OUT_ERROR = 1004;
/**
- 网络(协议)错误
*/
public static final int HTTP_ERROR = 1005;
/**
- 证书错误
*/
public static final int SSL_ERROR = 1006;
public HttpThrowable(int errorType, String message, Throwable throwable) {
super(throwable);
this.errorType = errorType;
this.message = message;
this.throwable = throwable;
}
}
import com.alibaba.fastjson.JSONException;
import com.google.gson.JsonParseException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import retrofit2.HttpException;
public class ThrowableHandler {
public static HttpThrowable handleThrowable(Throwable throwable) {
if (throwable instanceof HttpException) {
return new HttpThrowable(HttpThrowable.HTTP_ERROR, “网络(协议)异常”, throwable);
} else if (throwable instanceof JsonParseException || throwable instanceof JSONException || throwable instanceof ParseException) {
return new HttpThrowable(HttpThrowable.PARSE_ERROR, “数据解析异常”, throwable);
} else if (throwable instanceof UnknownHostException) {
return new HttpThrowable(HttpThrowable.NO_NET_ERROR, “网络连接失败,请稍后重试”, throwable);
} else if (throwable instanceof SocketTimeoutException) {
return new HttpThrowable(HttpThrowable.TIME_OUT_ERROR, “连接超时”, throwable);
} else if (throwable instanceof ConnectException) {
return new HttpThrowable(HttpThrowable.CONNECT_ERROR, “连接异常”, throwable);
} else if (throwable instanceof javax.net.ssl.SSLHandshakeException) {
return new HttpThrowable(HttpThrowable.SSL_ERROR, “证书验证失败”, throwable);
} else {
return new HttpThrowable(HttpThrowable.UNKNOWN, throwable.getMessage(), throwable);
}
}
}
- 误时重试
public class RetryWithDelay implements Function<Observable, ObservableSource<?>> {
private int retryDelaySeconds;//延迟重试的时间
private int retryCount;//记录当前重试次数
private int retryCountMax;//最大重试次数
public RetryWithDelay(int retryDelaySeconds, int retryCountMax) {
this.retryDelaySeconds = retryDelaySeconds;
this.retryCountMax = retryCountMax;
}
@Override
public ObservableSource<?> apply(Observable throwableObservable) throws Exception {
//方案一:使用全局变量来控制重试次数,重试3次后不再重试,通过代码显式回调onError结束请求
return throwableObservable.flatMap(new Function<Throwable, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(Throwable throwable) throws Exception {
//如果失败的原因是UnknownHostException(DNS解析失败,当前无网络),则没必要重试,直接回调error结束请求即可
if (throwable instanceof UnknownHostException) {
return Observable.error(throwable);
}
//没超过最大重试次数的话则进行重试
if (++retryCount <= retryCountMax) {
//延迟retryDelaySeconds后开始重试
return Observable.timer(retryDelaySeconds, TimeUnit.SECONDS);
}
return Observable.error(throwable);
}
});
}
}
- 拦截器
public class CacheIntercepter implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
//对request的设置用来指定有网/无网下所走的方式
//对response的设置用来指定有网/无网下的缓存时长
Request request = chain.request();
if (!NetworkUtils.isNetWorkAvailable(AppGlobals.getApplication())) {
//无网络下强制使用缓存,无论缓存是否过期,此时该请求实际上不会被发送出去。
//有网络时则根据缓存时长来决定是否发出请求
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE).build();
}
Response response = chain.proceed(request);
if (NetworkUtils.isNetWorkAvailable(AppGlobals.getApplication())) {
//有网络情况下,超过1分钟,则重新请求,否则直接使用缓存数据
int maxAge = 60; //缓存一分钟
String cacheControl = “public,max-age=” + maxAge;
//当然如果你想在有网络的情况下都直接走网络,那么只需要
//将其超时时间maxAge设为0即可
return response.newBuilder()
.header(“Cache-Control”, cacheControl)
.removeHeader(“Pragma”).build();
} else {
//无网络时直接取缓存数据,该缓存数据保存3天
int maxStale = 60 * 60 * 24 * 3; //无网络时,设置超时为3天
return response.newBuilder()
.header(“Cache-Control”, “public,only-if-cached,max-stale=” + maxStale)
.removeHeader(“Pragma”).build();
}
}
}
public class HeaderInterceptor implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
Request originalRequest = chain.request();
Request.Builder builder = originalRequest.newBuilder();
s, TimeUnit.SECONDS);
}
return Observable.error(throwable);
}
});
}
}
- 拦截器
public class CacheIntercepter implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
//对request的设置用来指定有网/无网下所走的方式
//对response的设置用来指定有网/无网下的缓存时长
Request request = chain.request();
if (!NetworkUtils.isNetWorkAvailable(AppGlobals.getApplication())) {
//无网络下强制使用缓存,无论缓存是否过期,此时该请求实际上不会被发送出去。
//有网络时则根据缓存时长来决定是否发出请求
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE).build();
}
Response response = chain.proceed(request);
if (NetworkUtils.isNetWorkAvailable(AppGlobals.getApplication())) {
//有网络情况下,超过1分钟,则重新请求,否则直接使用缓存数据
int maxAge = 60; //缓存一分钟
String cacheControl = “public,max-age=” + maxAge;
//当然如果你想在有网络的情况下都直接走网络,那么只需要
//将其超时时间maxAge设为0即可
return response.newBuilder()
.header(“Cache-Control”, cacheControl)
.removeHeader(“Pragma”).build();
} else {
//无网络时直接取缓存数据,该缓存数据保存3天
int maxStale = 60 * 60 * 24 * 3; //无网络时,设置超时为3天
return response.newBuilder()
.header(“Cache-Control”, “public,only-if-cached,max-stale=” + maxStale)
.removeHeader(“Pragma”).build();
}
}
}
public class HeaderInterceptor implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
Request originalRequest = chain.request();
Request.Builder builder = originalRequest.newBuilder();
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- Json的处理
1、介绍 JSON(JavaScript Object Notation):是一种轻量级的数据交换格式。它是基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写ÿ…...
2024/4/18 5:48:07 - uniapp 下拉刷新
uniapp 下拉刷新(全局&单页面) 全局设置 在pages.json文件的globalStyle对象中开启enablePullDownRefresh属性 单页面 在pages.json文件中的pages数组中找到对应的页面,在对应页面的style属性中开启enablePullDownRefresh属性 下拉刷…...
2024/4/14 10:17:00 - 达梦dmhs的数据对比工具veri配置使用
VERI说明 dmhs自带对比工具,装好dmhs后在bin目录下就可找到,名为dmhs_veri 该工具需要使用unixODBC,2.3.0 及以上的版本,用于oracle等数据库的连接使用。若为dm,则不用。 VERI需要一个AGENT,用于数据获取…...
2024/4/14 10:16:35 - 如何启动oracle实例及监听
启动oracle需要同时启动oracle实例以及监听器 1 如何启动oracle实例 切换用户:su - oracle设置启动实例:export ORACLE_SIDorcl ,orcl为你要启动的实例的名称连接:sqlplus / as sysdba启动:startup,如果要…...
2024/4/20 1:35:19 - [渝粤教育] 南京工业职业技术大学 传感与智能控制技术 参考 资料
教育 -传感与智能控制技术-章节资料考试资料-南京工业职业技术大学【】 随堂测验 1、【单选题】下列说法错误的是 A、传感器是实现自动检测和自动控制的首要环节让物体有了触觉、味觉和嗅觉 B、传感器的功能可替代人类5大感觉器官 C、传感器是获取自然和生产领域中信息的主要途…...
2024/5/4 4:16:09 - 双引擎驱动 Quick BI 十亿数据0.3秒分析,首屏展示时间缩短30%
“Quick”是产品始终追求的目标 Quick BI数据可视化分析平台,在2021年二次入选了Gartner ABI魔力象限,这是对产品本身能力强有力的认证。在不断夯实B I的可视化体验和权限管控能力之外,推进Quick BI的全场景数据消费能力,让数据在…...
2024/4/14 10:16:55 - 盘点2022年有影响力的五种顶级NFT头像
盘点2022年15 个顶级NFT头像 NFT头像在去年风靡一时。作为一种简单的即插即用方法,任何人都可以将特征(身体、头部、背景等)加载到应用程序中以快速混合搭配 NFT 创建,因此它已成为制作头像比以往任何时候都容易。 考虑到今年 NFT…...
2024/4/14 10:16:30 - 七 信号和槽机制
文章目录前言一、信号和槽定义二、signal slot 标志三、connect总结前言 信号和槽是Qt特有的消息传输机制,它能将相互独立的控件关联起来 一、信号和槽定义 QObject::connect(谁信号>处理者槽) 信号 当用户和控件进行交互时(比如点击,…...
2024/4/15 16:08:42 - 交通事故案中60岁以上的老人如何算赔偿
如果你不幸遇到了交通事故的案件,在案件中有发生伤亡事故的肯定会涉及人身赔偿问题。那么在交通事故案中60岁以上的老人如何算赔偿?60岁以上的老年人劳动是否受法律保护?60岁以上的老年人如何计算误工费?信阳律师已经整理了如下的…...
2024/4/16 17:40:50 - BestHTTP Dome
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using BestHTTP; using BestHTTP.WebSocket; using System.Text;public class WebSocket_ {string address "wss://127.0.0.1:8000";WebSocket webSocket;//初始化p…...
2024/4/14 10:17:51 - Java基础(11)- StringBuffer
目录 概述 StringBuffer的构造方法 Stringbuffer的方法 添加功能 删除功能 替换和反转功能 查找功能 截取功能(这两个方法的返回值不再是StringBuffer本身) StringBuffer和String的相互转换 StringBuffer和StringBuilder的区别 String和StringBuffer分别作为参数传递…...
2024/4/14 16:56:45 - ICCID/IIN
前六位运营商代码: 中国移动的为:898600;898602;898604;898607 。 中国联通的为:898601、898606、898609。 中国电信898603。...
2024/4/18 18:47:05 - spring中@ComponentScan得用法
1. value:指定要扫描的包。 2.excludeFilters Filter[] :指定扫描的时候按照什么规则排除那些组件。 3.includeFilters Filter[] :指定扫描的时候只需要包含哪些组件(但是我们要将useDefaultFilters设置为flase)。 其中的Fil…...
2024/4/14 10:17:21 - 36设计模式学习笔记
设计模式学习笔记文章目录1.设计模式简介1.单例模式2.工厂方法3.抽象工厂4.责任链模式5.模板方法 ok一.模板方法简介二.模式的定义和特点三.模式的结构和实现四.什么是模板方法模式五.模板方法的应用六.demo七.项目实战6.策略模式 ok6.1 策略模式简介6.2 模式的定义和特点6.3 d…...
2024/4/14 10:17:31 - 尚硅谷MySQL高级详细笔记
MySQL高级1. 写在前面2. MySQL的架构介绍3. MySQL_Linux版的安装1. 写在前面 学习链接:https://www.bilibili.com/video/av59623481 2. MySQL的架构介绍 mysql简介 概述: mysql是一个关系型数据库管理系统,由瑞典Mysql AB公司开发,目前属于Oracle.mysql是一种关系…...
2024/4/14 10:17:21 - ubuntu iostat命令
iostat#m 按兆显示 iostat -m#更人性化的输出 iostat -h %userCPU在用户态执行进程的时间百分比。%niceCPU在用户态模式下,用于nice操作,所占用CPU总时间的百分比%systemCPU处在内核态执行进程的时间百分比%iowaitCPU用于等待I/O操作占用CPU总时间的百分…...
2024/4/14 10:17:31 - redission实践
本文将基于redis实现分布式锁 我们使用第三方库redission来实现对redis的操作, maven引入redission如下 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.11.4</version> <…...
2024/4/14 10:17:36 - make xxx_defconfig
目录 1、config规则和%config规则 1.1、执行命令 1.2、scripts/kconfig/Makefile 1.2.1、conf 2、scripts_basic规则 2.1、执行命令 2.2、scripts/basic/Makefile 3、outputmakefile规则 4、总结 1、config规则和%config规则 当输入make xxx_defconfig的时候就会匹配…...
2024/4/14 10:17:46 - C语言简单练习题——No.4 ,关于二进制的缩短
题目链接: 缩短二进制_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/4ffcc9f206b949ddb057ee0099b34d51?tpId107&&tqId33288&rp1&ru/ta/beginner-programmers&qru/ta/beginner-programmers/question-ranking 知识点&am…...
2024/4/14 14:44:01 - ElasticSearch的使用到集成springboot
ElasticSearch的使用到集成springboot Elasticsearch概述 一、什么是Elasticsearch? Lucene简介 Lucene是一套用于全文检索和搜寻的开源程序库,由Apache软件基金会支持和提供 Lucene提供了一个简单却强大的应用程序接口(API)&…...
2024/4/5 4:41:42
最新文章
- 手撕vector的模拟实现
𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…...
2024/5/4 9:02:55 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 将.docx格式文件转成html,uniapp使用u-parse展示
使用mammoth。 1、在index.html中加入: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewp…...
2024/5/2 6:04:57 - composer常见错误解决
在Java中,常见的问题和解决方法包括: 内存不足错误:Java应用程序在运行时可能会遇到内存不足的错误。可以通过增加JVM的堆内存大小来解决,可以通过设置-Xms和-Xmx参数来指定初始堆大小和最大堆大小。 java -Xms2G -Xmx4G YourAppl…...
2024/4/30 3:27:03 - Databend 开源周报第 138 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持多表插入 …...
2024/5/3 8:55:09 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/1 17:30:59 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/2 16:16:39 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/3 23:10:03 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/2 15:04:34 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/4 2:59:34 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/2 9:07:46 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57