当前位置:   article > 正文

Android Okhttp3的使用(很全面,包含Post提交字符串、键值对、表单、上传文件、无参请求和Get有参无参请求,还有自动添加token)

android okhttp3

Okhttp简介

okhttp是现代化应用程序的网络通信的方式。它用来帮助程序交换数据和媒体信息,使用okhttp可以让你的程序加载物料(翻译为服务器数据更合适在)更加高效、更节省网络带宽。

okhttp通过以下措施让你的网络更加高效
1. HTTP/2支持对同一个host的所有网络请求 共享socket。
2. 在不启用HTTP/2的情况,连接池能减少潜在的网络请求。
3. 透明GZIP技术压缩了下载数据的大小。
4. 结果缓存技术避免重复的网络请求。

   OkHttp在网络出现问题时,仍然能支持良好的运行。它能解决常见的网络连接问题。如果你的服务端有多个ip地址,okhttp会在第一个地址连接失败时,自动尝试备用地址。 这种技术在你的服务器有多地备份时,是必须要用到的。OkHttp支持现代TLS特性(TLS 1.3、ALPN、证书固定)。可以将其配置为回滚以实现广播连接。

Okhttp优点

1. 支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验)。
2. socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,减少了请求延迟,共享Socket,减少对服务器的请求次数。
3. 基于Headers的缓存策略减少重复的网络请求。
4. 拥有Interceptors轻松处理请求与响应(自动处理GZip压缩)。


Okhttp的应用

用于替代HttpUrlConnection和Apache HttpClient
Android4.4开始,google已经开始将源码中的HttpURLConnection替换为OkHttp
Android6.0里已移除HttpClient。

OKhttp的功能

  1. PUT,DELETE,POST,GET等请求
  2. 文件的上传下载
  3. 加载图片(内部会图片大小自动压缩)
  4. 支持请求回调,直接返回对象、对象集合
  5. 支持session的保持

使用方式

以下代码在项目里,项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2

1.首先添加访问网络权限在manifest里。

  1. <!-- 允许访问网络的权限 -->
  2. <uses-permission android:name="android.permission.INTERNET" />

2.添加依赖(如果同步失败,可能是因为公司的网络有好多情况下连不到Google的仓库,所以就要连接自己的手机热点进行同步,手机热点一般会同步成功的,但是注意流量消耗)。

  1. //okhttp3网络框架导入(我用的Android Studio 3.0.1)
  2. implementation 'com.squareup.okhttp3:okhttp:3.12.0'
  3. //fastjson(阿里云json解析框架导入)
  4. implementation 'com.alibaba:fastjson:1.2.61'

3.初始化Okhttp3。

(1)Okhttp3的初始化。

  1. private static final String TAG = Okhttp3Manager.class.getSimpleName();
  2. private OkHttpClient client;
  3. private static Okhttp3Manager manager;
  4. public static final int UPDATA = 666;
  5. /**
  6. * 单例模式,所以构造函数私有化
  7. */
  8. private Okhttp3Manager() {
  9. //创建OkHttpClient对象
  10. client = new OkHttpClient.Builder()
  11. .connectTimeout(5000, TimeUnit.MILLISECONDS) //连接超时
  12. .readTimeout(5000, TimeUnit.MILLISECONDS) //读取超时
  13. .writeTimeout(5000, TimeUnit.MILLISECONDS) //写入超时
  14. .addInterceptor(new AddAccessTokenInterceptor(BaseApplication.getInstance())) //拦截器用于设置header
  15. .addInterceptor(new ReceivedAccessTokenInterceptor(BaseApplication.getInstance())) //拦截器用于接收并持久化cookie
  16. .sslSocketFactory(SSLSocketManager.getSSLSocketFactory())//配置(只有https请求需要配置)
  17. .hostnameVerifier(SSLSocketManager.getHostnameVerifier())//配置(只有https请求需要配置)
  18. // .proxy(Proxy.NO_PROXY)
  19. .build();
  20. }
  21. /**
  22. * 线程安全的单例模式,整个项目中只有一个okhttp3实例
  23. *
  24. * @return
  25. */
  26. public static Okhttp3Manager getInstance() {
  27. if (manager == null) {
  28. synchronized (Okhttp3Manager.class) {
  29. if (manager == null) {
  30. manager = new Okhttp3Manager();
  31. }
  32. }
  33. }
  34. return manager;
  35. }

(2)添加token拦截器(关于accessToken的详细说明,请看还傻傻分不清 Cookie、Session、Token、JWT?_UrasakiNakajima的博客-CSDN博客_jwt和token区别。)

  1. public class AddTokenInterceptor implements Interceptor {
  2. private static final String TAG = "AddCookiesInterceptor";
  3. private BaseApplication baseApplication;
  4. public AddTokenInterceptor(BaseApplication baseApplication) {
  5. super();
  6. this.baseApplication = baseApplication;
  7. }
  8. @NonNull
  9. @Override
  10. public Response intercept(@NonNull Chain chain) throws IOException {
  11. Request.Builder builder = chain.request().newBuilder();
  12. //添加accessToken
  13. String accessToken = baseApplication.getAccessToken();
  14. if (!TextUtils.isEmpty(accessToken)) {
  15. builder.addHeader("accessToken", accessToken);
  16. LogManager.i(TAG, "accessToken*****" + accessToken);
  17. }
  18. // //添加cookie
  19. // String cookie = baseApplication.getCookie();
  20. // if (cookie != null && !"".equals(cookie)) {
  21. // builder.addHeader("cookie", cookie);
  22. // LogManager.i(TAG, "cookie*****" + cookie);
  23. // }
  24. // //添加用户代理
  25. // builder.removeHeader("User-Agent")
  26. // .addHeader("User-Agent",
  27. // SystemManager.getUserAgent(baseApplication.getApplicationContext())).build();
  28. // builder.removeHeader("User-Agent")//移除旧的
  29. // .addHeader("User-Agent", WebSettings.getDefaultUserAgent(baseApplication));//添加真正的头部
  30. return chain.proceed(builder.build());
  31. }
  32. }
  1. public class ReceivedTokenInterceptor implements Interceptor {
  2. private static final String TAG = "ReceivedCookiesInterceptor";
  3. private BaseApplication baseApplication;
  4. public ReceivedTokenInterceptor(Context context) {
  5. super();
  6. baseApplication = (BaseApplication) context.getApplicationContext();
  7. }
  8. @NonNull
  9. @Override
  10. public Response intercept(@NonNull Chain chain) throws IOException {
  11. Response originalResponse = chain.proceed(chain.request());
  12. //这里获取请求返回的accessToken
  13. String accessToken = originalResponse.header("accessToken");
  14. LogManager.i(TAG, "originalResponse appToken*****" + accessToken);
  15. if (!TextUtils.isEmpty(accessToken)) {
  16. baseApplication.setAccessToken(accessToken);
  17. LogManager.i(TAG, "accessToken*****" + accessToken);
  18. }
  19. // //这里获取请求返回的cookie
  20. // if (!originalResponse.headers("set-cookie").isEmpty()) {
  21. // String cookie = originalResponse.header("set-cookie").split(";")[0];
  22. // mineApplication.setCookie(cookie);
  23. // LogManager.i(TAG, "cookie*****" + cookie);
  24. // }
  25. Response.Builder builder = originalResponse.newBuilder();
  26. return builder.build();
  27. }
  28. }

(3)Application中的Shared存储(用于存储accessToken)。

  1. //声明 初始化
  2. protected SharedPreferences sp;
  3. protected SharedPreferences.Editor editor;
  4. protected static final int MODE = Context.MODE_PRIVATE;

//初始化(在Appcation中的onCreate函数里)

  1. //文件为mySp 存放在/data/data/<packagename>/shared_prefs/目录下的
  2. sp = getSharedPreferences("app", MODE);
  3. editor = sp.edit();
  1. //在Application里添加函数
  2. public void setAccessToken(String accessToken) {
  3. LogManager.i(TAG, "setAccessToken***" + accessToken);
  4. editor.putString("accessToken", accessToken);
  5. editor.commit();
  6. }
  7. public void setLogout() {
  8. LogManager.i(TAG, "setLogout***");
  9. // editor.clear();
  10. editor.remove("accessToken");
  11. editor.remove("isLogin");
  12. editor.commit();
  13. }

(4)添加SSLSocketManager类。(https请求才需要写并配置,http请求不用配置)。

  1. package com.phone.common_library.manager;
  2. import java.security.SecureRandom;
  3. import java.security.cert.X509Certificate;
  4. import javax.net.ssl.HostnameVerifier;
  5. import javax.net.ssl.SSLContext;
  6. import javax.net.ssl.SSLSession;
  7. import javax.net.ssl.SSLSocketFactory;
  8. import javax.net.ssl.TrustManager;
  9. import javax.net.ssl.X509TrustManager;
  10. /**
  11. * okhttp3忽略https证书
  12. */
  13. public class SSLSocketManager {
  14. /**
  15. * 获取这个SSLSocketFactory
  16. *
  17. * @return
  18. */
  19. public static SSLSocketFactory getSSLSocketFactory() {
  20. try {
  21. SSLContext sslContext = SSLContext.getInstance("SSL");
  22. sslContext.init(null, getTrustManager(), new SecureRandom());
  23. return sslContext.getSocketFactory();
  24. } catch (Exception e) {
  25. throw new RuntimeException(e);
  26. }
  27. }
  28. /**
  29. * 获取trustManager
  30. *
  31. * @return
  32. */
  33. public static TrustManager[] getTrustManager() {
  34. TrustManager[] trustManager = new TrustManager[]{
  35. new X509TrustManager() {
  36. @Override
  37. public void checkClientTrusted(X509Certificate[] chain, String authType) {
  38. }
  39. @Override
  40. public void checkServerTrusted(X509Certificate[] chain, String authType) {
  41. }
  42. @Override
  43. public X509Certificate[] getAcceptedIssuers() {
  44. return new X509Certificate[]{};
  45. }
  46. }
  47. };
  48. return trustManager;
  49. }
  50. /**
  51. * 获取hostnameVerifier
  52. *
  53. * @return
  54. */
  55. public static HostnameVerifier getHostnameVerifier() {
  56. HostnameVerifier hostnameVerifier = new HostnameVerifier() {
  57. @Override
  58. public boolean verify(String s, SSLSession sslSession) {
  59. return true;
  60. }
  61. };
  62. return hostnameVerifier;
  63. }
  64. }

4.自定义接口。

  1. public interface OnCommonSingleParamCallback<T> {
  2. void onSuccess(T success);
  3. void onError(String error);
  4. }

5.自定义子线程切换主线程管理类MainThreadManager。

  1. public class MainThreadManager {
  2. private Handler mainThreadHandler;
  3. private OnSubThreadToMainThreadCallback onSubThreadToMainThreadCallback;
  4. public MainThreadManager() {
  5. }
  6. public MainThreadManager(OnSubThreadToMainThreadCallback onSubThreadToMainThreadCallback) {
  7. this.onSubThreadToMainThreadCallback = onSubThreadToMainThreadCallback;
  8. if (Looper.myLooper() != Looper.getMainLooper()) {
  9. // If we finish marking off of the main thread, we need to
  10. // actually do it on the main thread to ensure correct ordering.
  11. mainThreadHandler = new Handler(Looper.getMainLooper());
  12. mainThreadHandler.post(new Runnable() {
  13. @Override
  14. public void run() {
  15. onSubThreadToMainThreadCallback.onSuccess();
  16. mainThreadHandler.removeCallbacksAndMessages(null);
  17. mainThreadHandler = null;
  18. }
  19. });
  20. } else {
  21. onSubThreadToMainThreadCallback.onSuccess();
  22. }
  23. }
  24. public void setOnSubThreadToMainThreadCallback(OnSubThreadToMainThreadCallback onSubThreadToMainThreadCallback) {
  25. this.onSubThreadToMainThreadCallback = onSubThreadToMainThreadCallback;
  26. }
  27. /**
  28. * 子线程到主线程
  29. */
  30. public void subThreadToUIThread() {
  31. if (Looper.myLooper() != Looper.getMainLooper()) {
  32. // If we finish marking off of the main thread, we need to
  33. // actually do it on the main thread to ensure correct ordering.
  34. mainThreadHandler = new Handler(Looper.getMainLooper());
  35. mainThreadHandler.post(new Runnable() {
  36. @Override
  37. public void run() {
  38. onSubThreadToMainThreadCallback.onSuccess();
  39. mainThreadHandler.removeCallbacksAndMessages(null);
  40. mainThreadHandler = null;
  41. }
  42. });
  43. } else {
  44. onSubThreadToMainThreadCallback.onSuccess();
  45. }
  46. }
  47. }

6.get请求,异步方式。

  1. /**
  2. * get请求,异步方式,是在子线程中执行的,需要切换到主线程才能更新UI
  3. *
  4. * @param url
  5. * @param onCommonSingleParamCallback
  6. */
  7. public void getAsync(String url,
  8. OnCommonSingleParamCallback<String> onCommonSingleParamCallback) {
  9. //2.创建Request对象,设置一个url地址(百度地址),设置请求方式。
  10. Request request = new Request.Builder().url(url).method("GET", null).build();
  11. // Request request = new Request.Builder()
  12. // .url(url)
  13. // .get()//默认就是GET请求,可以不写(最好写上,要清晰表达出来)
  14. // .build();
  15. //3.创建一个call对象,参数就是Request请求对象
  16. Call call = client.newCall(request);
  17. //4 执行Call
  18. call.enqueue(new Callback() {
  19. @Override
  20. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  21. LogManager.i(TAG, "getAsync onFailure e*******" + e.toString());
  22. LogManager.i(TAG, "getAsync onFailure e detailMessage*******" + e.getMessage());
  23. MainThreadManager mainThreadManager = new MainThreadManager();
  24. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  25. @Override
  26. public void onSuccess() {
  27. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.network_sneak_off));
  28. }
  29. });
  30. mainThreadManager.subThreadToUIThread();
  31. }
  32. @Override
  33. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  34. String responseString = response.body().string();
  35. LogManager.i(TAG, "getAsync onResponse responseString*****" + responseString);
  36. MainThreadManager mainThreadManager = new MainThreadManager();
  37. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  38. @Override
  39. public void onSuccess() {
  40. if (!TextUtils.isEmpty(responseString)) {
  41. BaseResponse baseResponse;
  42. try {
  43. baseResponse = JSON.parseObject(responseString, BaseResponse.class);
  44. } catch (Exception e) {
  45. //如果不是标准json字符串,就返回错误提示
  46. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  47. return;
  48. }
  49. onCommonSingleParamCallback.onSuccess(responseString);
  50. } else {
  51. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  52. }
  53. }
  54. });
  55. mainThreadManager.subThreadToUIThread();
  56. }
  57. });
  58. }

7.get请求,携带请求参数​​​​​​​,异步方式。

  1. /**
  2. * get请求,添加请求参数,异步方式,是在子线程中执行的,需要切换到主线程才能更新UI
  3. *
  4. * @param url
  5. * @param bodyParams
  6. * @param onCommonSingleParamCallback
  7. */
  8. public void getAsync(String url,
  9. Map<String, String> bodyParams,
  10. OnCommonSingleParamCallback<String> onCommonSingleParamCallback) {
  11. String urlNew = url;
  12. // 设置HTTP请求参数
  13. urlNew += getBodyParams(bodyParams);
  14. //2.创建Request对象,设置一个url地址,设置请求方式。
  15. Request request = new Request.Builder().url(urlNew).get().build();
  16. // Request request = new Request.Builder()
  17. // .url(url)
  18. // .get()//默认就是GET请求,可以不写(最好写上,要清晰表达出来)
  19. // .build();
  20. //3.创建一个call对象,参数就是Request请求对象
  21. Call call = client.newCall(request);
  22. //4 执行Call
  23. call.enqueue(new Callback() {
  24. @Override
  25. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  26. LogManager.i(TAG, "getAsync onFailure e*******" + e.toString());
  27. LogManager.i(TAG, "getAsync onFailure e detailMessage*******" + e.getMessage());
  28. MainThreadManager mainThreadManager = new MainThreadManager();
  29. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  30. @Override
  31. public void onSuccess() {
  32. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.network_sneak_off));
  33. }
  34. });
  35. mainThreadManager.subThreadToUIThread();
  36. }
  37. @Override
  38. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  39. String responseString = response.body().string();
  40. LogManager.i(TAG, "getAsync onResponse responseString*****" + responseString);
  41. MainThreadManager mainThreadManager = new MainThreadManager();
  42. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  43. @Override
  44. public void onSuccess() {
  45. if (!TextUtils.isEmpty(responseString)) {
  46. BaseResponse baseResponse;
  47. try {
  48. baseResponse = JSON.parseObject(responseString, BaseResponse.class);
  49. } catch (Exception e) {
  50. //如果不是标准json字符串,就返回错误提示
  51. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  52. return;
  53. }
  54. onCommonSingleParamCallback.onSuccess(responseString);
  55. } else {
  56. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  57. }
  58. }
  59. });
  60. mainThreadManager.subThreadToUIThread();
  61. }
  62. });
  63. }
  1. /**
  2. * 添加参数
  3. *
  4. * @param bodyParams
  5. * @return
  6. */
  7. private String getBodyParams(Map<String, String> bodyParams) {
  8. //1.添加请求参数
  9. //遍历map中所有参数到builder
  10. if (bodyParams != null && bodyParams.size() > 0) {
  11. StringBuffer stringBuffer = new StringBuffer("?");
  12. for (String key : bodyParams.keySet()) {
  13. if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(bodyParams.get(key))) {
  14. //如果参数不是null并且不是"",就拼接起来
  15. stringBuffer.append("&");
  16. stringBuffer.append(key);
  17. stringBuffer.append("=");
  18. stringBuffer.append(bodyParams.get(key));
  19. }
  20. }
  21. return stringBuffer.toString();
  22. } else {
  23. return "";
  24. }
  25. }
  26. /**
  27. * 添加headers
  28. *
  29. * @param headerParams
  30. * @return
  31. */
  32. private Headers setHeaderParams(Map<String, String> headerParams) {
  33. Headers headers = null;
  34. Headers.Builder headersbuilder = new Headers.Builder();
  35. if (headerParams != null && headerParams.size() > 0) {
  36. for (String key : headerParams.keySet()) {
  37. if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(bodyParams.get(key))) {
  38. //如果参数不是null并且不是"",就拼接起来
  39. headersbuilder.add(key, headerParams.get(key));
  40. }
  41. }
  42. }
  43. headers = headersbuilder.build();
  44. return headers;
  45. }

​​​​​​​8.get请求,添加请求参数和header参数,异步方式。

  1. /**
  2. * get请求,添加请求参数和header参数,异步方式,是在子线程中执行的,需要切换到主线程才能更新UI
  3. *
  4. * @param url
  5. * @param headerParams
  6. * @param bodyParams
  7. * @param onCommonSingleParamCallback
  8. */
  9. public void getAsync(String url,
  10. Map<String, String> headerParams,
  11. Map<String, String> bodyParams,
  12. OnCommonSingleParamCallback<String> onCommonSingleParamCallback) {
  13. String urlNew = url;
  14. // 设置HTTP请求参数
  15. urlNew += getBodyParams(bodyParams);
  16. Headers headers = setHeaderParams(headerParams);
  17. //2.创建Request对象,设置一个url地址,设置请求方式。
  18. Request request = new Request.Builder().url(urlNew).get().headers(headers).build();
  19. // Request request = new Request.Builder()
  20. // .url(url)
  21. // .get()//默认就是GET请求,可以不写(最好写上,要清晰表达出来)
  22. // .build();
  23. //3.创建一个call对象,参数就是Request请求对象
  24. Call call = client.newCall(request);
  25. //4 执行Call
  26. call.enqueue(new Callback() {
  27. @Override
  28. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  29. LogManager.i(TAG, "getAsync onFailure e*******" + e.toString());
  30. LogManager.i(TAG, "getAsync onFailure e detailMessage*******" + e.getMessage());
  31. MainThreadManager mainThreadManager = new MainThreadManager();
  32. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  33. @Override
  34. public void onSuccess() {
  35. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.network_sneak_off));
  36. }
  37. });
  38. mainThreadManager.subThreadToUIThread();
  39. }
  40. @Override
  41. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  42. String responseString = response.body().string();
  43. LogManager.i(TAG, "getAsync onResponse responseString*****" + responseString);
  44. MainThreadManager mainThreadManager = new MainThreadManager();
  45. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  46. @Override
  47. public void onSuccess() {
  48. if (!TextUtils.isEmpty(responseString)) {
  49. BaseResponse baseResponse;
  50. try {
  51. baseResponse = JSON.parseObject(responseString, BaseResponse.class);
  52. } catch (Exception e) {
  53. //如果不是标准json字符串,就返回错误提示
  54. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  55. return;
  56. }
  57. onCommonSingleParamCallback.onSuccess(responseString);
  58. } else {
  59. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  60. }
  61. }
  62. });
  63. mainThreadManager.subThreadToUIThread();
  64. }
  65. });
  66. }

9.post请求提交字符串,异步方式。

  1. /**
  2. * post请求提交字符串,异步方式,是在子线程中执行的,需要切换到主线程才能更新UI
  3. *
  4. * @param url
  5. * @param bodyParams
  6. * @param onCommonSingleParamCallback
  7. */
  8. public void postAsyncString(String url,
  9. Map<String, String> bodyParams,
  10. OnCommonSingleParamCallback<String> onCommonSingleParamCallback) {
  11. JSONObject jsonObject = new JSONObject(bodyParams);
  12. String requestData = jsonObject.toString();
  13. LogManager.i(TAG, "postAsyncString requestData*****" + requestData);
  14. MediaType mediaType = MediaType.parse("application/json; charset=utf-8");//"类型,字节码"
  15. //2.通过RequestBody.create 创建requestBody对象
  16. RequestBody requestBody = RequestBody.create(mediaType, requestData);
  17. //3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入
  18. Request request = new Request.Builder().url(url).post(requestBody).build();
  19. //4.创建一个call对象,参数就是Request请求对象
  20. Call call = client.newCall(request);
  21. //4 执行Call
  22. call.enqueue(new Callback() {
  23. @Override
  24. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  25. LogManager.i(TAG, "postAsyncString onFailure e*******" + e.toString());
  26. LogManager.i(TAG, "postAsyncString onFailure e detailMessage*******" + e.getMessage());
  27. MainThreadManager mainThreadManager = new MainThreadManager();
  28. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  29. @Override
  30. public void onSuccess() {
  31. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.network_sneak_off));
  32. }
  33. });
  34. mainThreadManager.subThreadToUIThread();
  35. }
  36. @Override
  37. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  38. String responseString = response.body().string();
  39. LogManager.i(TAG, "postAsyncString onResponse responseString*****" + responseString);
  40. MainThreadManager mainThreadManager = new MainThreadManager();
  41. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  42. @Override
  43. public void onSuccess() {
  44. if (!TextUtils.isEmpty(responseString)) {
  45. BaseResponse baseResponse;
  46. try {
  47. baseResponse = JSON.parseObject(responseString, BaseResponse.class);
  48. } catch (Exception e) {
  49. //如果不是标准json字符串,就返回错误提示
  50. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  51. return;
  52. }
  53. onCommonSingleParamCallback.onSuccess(responseString);
  54. } else {
  55. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  56. }
  57. }
  58. });
  59. mainThreadManager.subThreadToUIThread();
  60. }
  61. });
  62. }

10.post请求不传递参数,异步方式。

  1. /**
  2. * post请求不携带参数,异步方式,是在子线程中执行的,需要切换到主线程才能更新UI
  3. *
  4. * @param url
  5. * @param onCommonSingleParamCallback
  6. */
  7. public void postAsync(String url,
  8. OnCommonSingleParamCallback<String> onCommonSingleParamCallback) {
  9. //这句话是重点Request
  10. //3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入
  11. Request request = new Request.Builder().post(RequestBody.create(null, "")).url(url).build();
  12. //4.创建一个call对象,参数就是Request请求对象
  13. Call call = client.newCall(request);
  14. //4 执行Call
  15. call.enqueue(new Callback() {
  16. @Override
  17. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  18. LogManager.i(TAG, "postAsync onFailure e*******" + e.toString());
  19. LogManager.i(TAG, "postAsync onFailure e detailMessage*******" + e.getMessage());
  20. MainThreadManager mainThreadManager = new MainThreadManager();
  21. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  22. @Override
  23. public void onSuccess() {
  24. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.network_sneak_off));
  25. }
  26. });
  27. mainThreadManager.subThreadToUIThread();
  28. // MainThreadManager mainThreadManager2 =
  29. // new MainThreadManager(new OnSubThreadToMainThreadCallback() {
  30. // @Override
  31. // public void onSuccess() {
  32. // onCommonSingleParamCallback.onError(context.getResources().getString(R.string.network_sneak_off));
  33. // }
  34. // });
  35. }
  36. @Override
  37. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  38. String responseString = response.body().string();
  39. LogManager.i(TAG, "postAsync onResponse responseString*****" + responseString);
  40. MainThreadManager mainThreadManager = new MainThreadManager();
  41. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  42. @Override
  43. public void onSuccess() {
  44. if (!TextUtils.isEmpty(responseString)) {
  45. BaseResponse baseResponse;
  46. try {
  47. baseResponse = JSON.parseObject(responseString, BaseResponse.class);
  48. } catch (Exception e) {
  49. //如果不是标准json字符串,就返回错误提示
  50. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  51. return;
  52. }
  53. onCommonSingleParamCallback.onSuccess(responseString);
  54. } else {
  55. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  56. }
  57. }
  58. });
  59. mainThreadManager.subThreadToUIThread();
  60. }
  61. });
  62. }

11.post请求提交流,异步方式。

  1. /**
  2. * post请求提交流,异步方式,是在子线程中执行的,需要切换到主线程才能更新UI
  3. *
  4. * @param url
  5. * @param requestData
  6. * @param onCommonSingleParamCallback
  7. */
  8. public void postAsyncStream(String url,
  9. String requestData,
  10. OnCommonSingleParamCallback<String> onCommonSingleParamCallback) {
  11. LogManager.i(TAG, "requestData*****" + requestData);
  12. //2.通过new RequestBody 创建requestBody对象
  13. RequestBody requestBody = new RequestBody() {
  14. @Nullable
  15. @Override
  16. public MediaType contentType() {
  17. return MediaType.parse("text/x-markdown; charset=utf-8");
  18. }
  19. @Override
  20. public void writeTo(@NonNull BufferedSink sink) throws IOException {
  21. sink.writeUtf8(requestData);
  22. }
  23. };
  24. //3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入
  25. Request request = new Request.Builder().url(url).post(requestBody).build();
  26. //4.创建一个call对象,参数就是Request请求对象
  27. Call call = client.newCall(request);
  28. //4 执行Call
  29. call.enqueue(new Callback() {
  30. @Override
  31. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  32. LogManager.i(TAG, "postAsyncStream onFailure e*******" + e.toString());
  33. LogManager.i(TAG, "postAsyncStream onFailure e detailMessage*******" + e.getMessage());
  34. MainThreadManager mainThreadManager = new MainThreadManager();
  35. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  36. @Override
  37. public void onSuccess() {
  38. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.network_sneak_off));
  39. }
  40. });
  41. mainThreadManager.subThreadToUIThread();
  42. }
  43. @Override
  44. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  45. String responseString = response.body().string();
  46. LogManager.i(TAG, "postAsyncStream onResponse responseString*****" + responseString);
  47. MainThreadManager mainThreadManager = new MainThreadManager();
  48. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  49. @Override
  50. public void onSuccess() {
  51. if (!TextUtils.isEmpty(responseString)) {
  52. BaseResponse baseResponse;
  53. try {
  54. baseResponse = JSON.parseObject(responseString, BaseResponse.class);
  55. } catch (Exception e) {
  56. //如果不是标准json字符串,就返回错误提示
  57. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  58. return;
  59. }
  60. onCommonSingleParamCallback.onSuccess(responseString);
  61. } else {
  62. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  63. }
  64. }
  65. });
  66. mainThreadManager.subThreadToUIThread();
  67. }
  68. });
  69. }

12.post请求提交键值对,异步方式。

  1. /**
  2. * post请求提交键值对,异步方式,是在子线程中执行的,需要切换到主线程才能更新UI
  3. *
  4. * @param url
  5. * @param bodyParams
  6. * @param onCommonSingleParamCallback
  7. */
  8. public void postAsyncKeyValuePairs(String url,
  9. Map<String, String> bodyParams,
  10. OnCommonSingleParamCallback<String> onCommonSingleParamCallback) {
  11. if (bodyParams != null && bodyParams.size() > 0) {
  12. LogManager.i(TAG, "postAsyncKeyValuePairs bodyParams*****" + bodyParams.toString());
  13. LogManager.i(TAG, "postAsyncKeyValuePairs bodyParams json*****" + MapManager.mapToJsonStr(bodyParams));
  14. }
  15. //2.通过new FormBody()调用build方法,创建一个RequestBody,可以用add添加键值对
  16. FormBody.Builder formEncodingBuilder = new FormBody.Builder();
  17. //1.添加请求参数
  18. //遍历map中所有参数到builder
  19. if (bodyParams != null && bodyParams.size() > 0) {
  20. for (String key : bodyParams.keySet()) {
  21. if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(bodyParams.get(key))) {
  22. formEncodingBuilder.add(key, bodyParams.get(key));
  23. }
  24. }
  25. }
  26. //构建请求体
  27. RequestBody requestBody = formEncodingBuilder.build();
  28. //3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入
  29. Request request = new Request.Builder().url(url).post(requestBody).build();
  30. //4.创建一个call对象,参数就是Request请求对象
  31. Call call = client.newCall(request);
  32. //4 执行Call
  33. call.enqueue(new Callback() {
  34. @Override
  35. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  36. LogManager.i(TAG, "postAsyncKeyValuePairs onFailure e*******" + e.toString());
  37. LogManager.i(TAG, "postAsyncKeyValuePairs onFailure e detailMessage*******" + e.getMessage());
  38. MainThreadManager mainThreadManager = new MainThreadManager();
  39. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  40. @Override
  41. public void onSuccess() {
  42. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.network_sneak_off));
  43. }
  44. });
  45. mainThreadManager.subThreadToUIThread();
  46. // MainThreadManager mainThreadManager2 =
  47. // new MainThreadManager(new OnSubThreadToMainThreadCallback() {
  48. // @Override
  49. // public void onSuccess() {
  50. // onCommonSingleParamCallback.onError(context.getResources().getString(R.string.network_sneak_off));
  51. // }
  52. // });
  53. }
  54. @Override
  55. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  56. String responseString = response.body().string();
  57. LogManager.i(TAG, "postAsyncKeyValuePairs onResponse responseString*****" + responseString);
  58. MainThreadManager mainThreadManager = new MainThreadManager();
  59. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  60. @Override
  61. public void onSuccess() {
  62. if (!TextUtils.isEmpty(responseString)) {
  63. BaseResponse baseResponse;
  64. try {
  65. baseResponse = JSON.parseObject(responseString, BaseResponse.class);
  66. } catch (Exception e) {
  67. //如果不是标准json字符串,就返回错误提示
  68. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  69. return;
  70. }
  71. onCommonSingleParamCallback.onSuccess(responseString);
  72. } else {
  73. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  74. }
  75. }
  76. });
  77. mainThreadManager.subThreadToUIThread();
  78. }
  79. });
  80. }

13.post请求上传Form表单,异步方式。

  1. /**
  2. * post请求上传Form表单,异步方式,提交表单,是在子线程中执行的,需要切换到主线程才能更新UI
  3. * 这个函数可以把服务器返回的数据统一处理
  4. *
  5. * @param url
  6. * @param bodyParams
  7. * @param onCommonSingleParamCallback
  8. */
  9. public void postAsyncForm(String url,
  10. Map<String, String> bodyParams,
  11. OnCommonSingleParamCallback<String> onCommonSingleParamCallback) {
  12. if (bodyParams != null && bodyParams.size() > 0) {
  13. LogManager.i(TAG, "postAsyncForm bodyParams String*******" + bodyParams.toString());
  14. LogManager.i(TAG, "postAsyncForm bodyParams json*****" + MapManager.mapToJsonStr(bodyParams));
  15. }
  16. // form 表单形式上传
  17. MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
  18. //1.添加请求参数
  19. //遍历map中所有参数到builder
  20. if (bodyParams != null && bodyParams.size() > 0) {
  21. for (String key : bodyParams.keySet()) {
  22. if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(bodyParams.get(key))) {
  23. multipartBodyBuilder.addFormDataPart(key, bodyParams.get(key));
  24. }
  25. }
  26. }
  27. //构建请求体
  28. RequestBody requestBody = multipartBodyBuilder.build();
  29. Request request = new Request.Builder().post(requestBody).url(url).build();
  30. //3 将Request封装为Call
  31. Call call = client.newCall(request);
  32. //4 执行Call
  33. call.enqueue(new Callback() {
  34. @Override
  35. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  36. LogManager.i(TAG, "postAsyncForm onFailure e*******" + e.toString());
  37. LogManager.i(TAG, "postAsyncForm onFailure e detailMessage*******" + e.getMessage());
  38. MainThreadManager mainThreadManager = new MainThreadManager();
  39. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  40. @Override
  41. public void onSuccess() {
  42. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.network_sneak_off));
  43. }
  44. });
  45. mainThreadManager.subThreadToUIThread();
  46. }
  47. @Override
  48. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  49. // //服务器返回的是加密字符串,要解密
  50. // String dataEncrypt = response.body().string();
  51. // LogManager.i(TAG, "login onResponse dataEncrypt*****" + dataEncrypt);
  52. String responseString = response.body().string();
  53. // try {
  54. // responseString = AESManager.aesDecrypt(dataEncrypt);
  55. LogManager.i(TAG, "postAsyncForm onResponse responseString*****" + responseString);
  56. MainThreadManager mainThreadManager = new MainThreadManager();
  57. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  58. @Override
  59. public void onSuccess() {
  60. if (!TextUtils.isEmpty(responseString)) {
  61. BaseResponse baseResponse;
  62. try {
  63. baseResponse = JSON.parseObject(responseString, BaseResponse.class);
  64. } catch (Exception e) {
  65. //如果不是标准json字符串,就返回错误提示
  66. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  67. return;
  68. }
  69. onCommonSingleParamCallback.onSuccess(responseString);
  70. } else {
  71. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  72. }
  73. }
  74. });
  75. mainThreadManager.subThreadToUIThread();
  76. // } catch (Exception e) {
  77. // e.printStackTrace();
  78. // }
  79. }
  80. });
  81. }

14.post请求上传Form表单和图片文件(上传java服务器),异步方式。

  1. /**
  2. * post请求上传Form表单和图片文件(上传java服务器),异步方式,提交表单,是在子线程中执行的,需要切换到主线程才能更新UI
  3. * 这个函数可以把服务器返回的数据统一处理
  4. *
  5. * @param url
  6. * @param bodyParams
  7. * @param fileList
  8. * @param onCommonSingleParamCallback
  9. */
  10. public void postAsyncFormAndFiles(String url,
  11. Map<String, String> bodyParams,
  12. List<File> fileList,
  13. OnCommonSingleParamCallback<String> onCommonSingleParamCallback) {
  14. if (bodyParams != null && bodyParams.size() > 0) {
  15. LogManager.i(TAG, "postAsyncFormAndFiles bodyParams String*******" + bodyParams.toString());
  16. LogManager.i(TAG, "postAsyncFormAndFiles bodyParams json*****" + MapManager.mapToJsonStr(bodyParams));
  17. }
  18. // MediaType MEDIA_TYPE = MediaType.parse("image/png");
  19. MediaType MEDIA_TYPE = MediaType.parse("image/*");
  20. // form 表单形式上传
  21. MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
  22. //1.添加请求参数
  23. //遍历map中所有参数到builder
  24. if (bodyParams != null && bodyParams.size() > 0) {
  25. for (String key : bodyParams.keySet()) {
  26. if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(bodyParams.get(key))) {
  27. multipartBodyBuilder.addFormDataPart(key, bodyParams.get(key));
  28. }
  29. }
  30. }
  31. //遍历fileList中所有图片绝对路径到builder,并约定key如"upload"作为上传php服务器接受多张图片的key
  32. if (fileList != null && fileList.size() > 0) {
  33. for (int i = 0; i < fileList.size(); i++) {
  34. if (fileList.get(i).exists()) {
  35. multipartBodyBuilder.addFormDataPart("upload", fileList.get(i).getName(), RequestBody.create(MEDIA_TYPE, fileList.get(i)));
  36. }
  37. }
  38. } else {
  39. LogManager.i(TAG, "postAsyncFormAndFiles fileList.size() = 0");
  40. }
  41. //构建请求体
  42. RequestBody requestBody = multipartBodyBuilder.build();
  43. Request request = new Request.Builder().post(requestBody).url(url).build();
  44. //3 将Request封装为Call
  45. Call call = client.newCall(request);
  46. //4 执行Call
  47. call.enqueue(new Callback() {
  48. @Override
  49. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  50. LogManager.i(TAG, "postAsyncFormAndFiles onFailure e*******" + e.toString());
  51. LogManager.i(TAG, "postAsyncFormAndFiles onFailure e detailMessage*******" + e.getMessage());
  52. MainThreadManager mainThreadManager = new MainThreadManager();
  53. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  54. @Override
  55. public void onSuccess() {
  56. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.network_sneak_off));
  57. }
  58. });
  59. mainThreadManager.subThreadToUIThread();
  60. }
  61. @Override
  62. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  63. String responseString = response.body().string();
  64. LogManager.i(TAG, "postAsyncFormAndFiles onResponse responseString*****" + responseString);
  65. MainThreadManager mainThreadManager = new MainThreadManager();
  66. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  67. @Override
  68. public void onSuccess() {
  69. if (!TextUtils.isEmpty(responseString)) {
  70. BaseResponse baseResponse;
  71. try {
  72. baseResponse = JSON.parseObject(responseString, BaseResponse.class);
  73. } catch (Exception e) {
  74. //如果不是标准json字符串,就返回错误提示
  75. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  76. return;
  77. }
  78. onCommonSingleParamCallback.onSuccess(responseString);
  79. } else {
  80. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  81. }
  82. }
  83. });
  84. mainThreadManager.subThreadToUIThread();
  85. }
  86. });
  87. }

15.post请求上传Form表单和文件(上传php服务器),异步方式。

  1. /**
  2. * post请求上传Form表单和文件(上传php服务器),异步方式,提交表单,是在子线程中执行的,需要切换到主线程才能更新UI
  3. *
  4. * @param url
  5. * @param bodyParams
  6. * @param fileList
  7. * @param onCommonSingleParamCallback
  8. */
  9. public void postAsyncPhpFormAndFiles(String url,
  10. Map<String, String> bodyParams,
  11. List<File> fileList,
  12. OnCommonSingleParamCallback<String> onCommonSingleParamCallback) {
  13. if (bodyParams != null && bodyParams.size() > 0) {
  14. LogManager.i(TAG, "postAsyncPhpFormAndFiles bodyParams String*******" + bodyParams.toString());
  15. LogManager.i(TAG, "postAsyncPhpFormAndFiles bodyParams json*****" + MapManager.mapToJsonStr(bodyParams));
  16. }
  17. MediaType MEDIA_TYPE = MediaType.parse("image/png");
  18. // form 表单形式上传
  19. MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
  20. //1.添加请求参数
  21. //遍历map中所有参数到builder
  22. if (bodyParams != null && bodyParams.size() > 0) {
  23. for (String key : bodyParams.keySet()) {
  24. if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(bodyParams.get(key))) {
  25. multipartBodyBuilder.addFormDataPart(key, bodyParams.get(key));
  26. }
  27. }
  28. }
  29. //遍历fileList中所有图片绝对路径到builder,并约定key如"upload[]"作为php服务器接受多张图片的key
  30. if (fileList != null && fileList.size() > 0) {
  31. for (int i = 0; i < fileList.size(); i++) {
  32. if (fileList.get(i).exists()) {
  33. multipartBodyBuilder.addFormDataPart("upload[]", fileList.get(i).getName(), RequestBody.create(MEDIA_TYPE, fileList.get(i)));
  34. }
  35. }
  36. }
  37. //构建请求体
  38. RequestBody requestBody = multipartBodyBuilder.build();
  39. Request request = new Request.Builder().post(requestBody).url(url).build();
  40. //3 将Request封装为Call
  41. Call call = client.newCall(request);
  42. //4 执行Call
  43. call.enqueue(new Callback() {
  44. @Override
  45. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  46. LogManager.i(TAG, "postAsyncPhpFormAndFiles onFailure e*******" + e.toString());
  47. LogManager.i(TAG, "postAsyncPhpFormAndFiles onFailure e detailMessage*******" + e.getMessage());
  48. MainThreadManager mainThreadManager = new MainThreadManager();
  49. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  50. @Override
  51. public void onSuccess() {
  52. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.network_sneak_off));
  53. }
  54. });
  55. mainThreadManager.subThreadToUIThread();
  56. }
  57. @Override
  58. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  59. String responseString = response.body().string();
  60. LogManager.i(TAG, "postAsyncPhpFormAndFiles onResponse responseString*****" + responseString);
  61. MainThreadManager mainThreadManager = new MainThreadManager();
  62. mainThreadManager.setOnSubThreadToMainThreadCallback(new OnSubThreadToMainThreadCallback() {
  63. @Override
  64. public void onSuccess() {
  65. if (!TextUtils.isEmpty(responseString)) {
  66. BaseResponse baseResponse;
  67. try {
  68. baseResponse = JSON.parseObject(responseString, BaseResponse.class);
  69. } catch (Exception e) {
  70. //如果不是标准json字符串,就返回错误提示
  71. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  72. return;
  73. }
  74. onCommonSingleParamCallback.onSuccess(responseString);
  75. } else {
  76. onCommonSingleParamCallback.onError(BaseApplication.getInstance().getResources().getString(R.string.server_sneak_off));
  77. }
  78. }
  79. });
  80. mainThreadManager.subThreadToUIThread();
  81. }
  82. });
  83. }

16.判断网络是否可用。

  1. /**
  2. * 判断网络是否可用
  3. *
  4. * @param context
  5. * @return
  6. */
  7. public static boolean isNetworkAvailable(Context context) {
  8. ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
  9. .getSystemService(Context.CONNECTIVITY_SERVICE);
  10. if (connectivityManager != null) {
  11. //如果仅仅是用来判断网络连接
  12. //connectivityManager.getActiveNetworkInfo().isAvailable();
  13. NetworkInfo[] info = connectivityManager.getAllNetworkInfo();
  14. // LogManager.i(TAG, "isNetworkAvailable*****" + info.toString());
  15. if (info != null) {
  16. for (int i = 0; i < info.length; i++) {
  17. if (info[i].getState() == NetworkInfo.State.CONNECTED) {
  18. return true;
  19. }
  20. }
  21. }
  22. }
  23. return false;
  24. }

17.代码中定义的字符串的string值。

  1. <string name="network_sneak_off">網絡開小差了</string>
  2. <string name="server_sneak_off">服務器開小差了</string>

如对此有疑问,请联系qq1164688204。

推荐Android开源项目

项目功能介绍:RxJava2和Retrofit2项目,添加自动管理token功能,添加RxJava2生命周期管理,使用App架构设计是MVP模式和MVVM模式,同时使用组件化,部分代码使用Kotlin,此项目持续维护中。

项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号