你的位置:首页 > 操作系统

[操作系统]android okvolley框架搭建


最近新出了很多好东西都没时间去好好看看,现在得好好复习下了,记下笔记

记得以前用的框架是android-async-http,volley啊,或者其它的,然后后面接着又出了okhttp,retrofit,rxjava很多新东西,有句话说的好啊,我不是程序员,我只是github上面的搬运工,出了这么多东西肯定会有很多人学习然后发表文章的,自己就去学习了下,因为以前用的是volley,所以就没去用retrofit了,因为volley也支持okhttp了,至于为什么要用okhttp就不多说了,毕竟不是大牛,只供小白学习,代码就是最好的老师啊,接下来就是用的okhttp和volley结合使用的框架体了。

接口请求类

 1 public class OkVolleyService { 2  3   public interface ClientCallback { 4     void onSuccess(Object data); 5  6     void onFailure(Exception e); 7  8     void onError(Exception e); 9   }10 11   public static void Login(String userID, String password, Context context,12               final ClientCallback callback) {13 14     String token = AuthFactory.encryptPassword(userID);15     Map<String, String> params = new HashMap<>();16     params.put("token", token);17     params.put("userName", userID);18     params.put("userPassword", password);19     RequestManager.PostString("/doctor/login.do", context, params,20         new Response.Listener<String>() {21           @Override22           public void onResponse(String response) {23             UsersEntity entity = null;24             try {25               entity = UsersEntity.parse(response);26             } catch (Exception e) {27               e.printStackTrace();28               callback.onError(e);29             }30             callback.onSuccess(entity);31           }32         }, new Response.ErrorListener() {33           @Override34           public void onErrorResponse(VolleyError error) {35             callback.onFailure(error);36           }37         });38 39   };40 41 }

View Code
支持https和网络请求类
public class HTTPSTrustManager implements X509TrustManager{  private static TrustManager[] trustManagers;  private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};  @Override  public void checkClientTrusted(      java.security.cert.X509Certificate[] x509Certificates, String s)      throws java.security.cert.CertificateException {    // To change body of implemented methods use File | Settings | File    // Templates.  }  @Override  public void checkServerTrusted(      java.security.cert.X509Certificate[] x509Certificates, String s)      throws java.security.cert.CertificateException {    // To change body of implemented methods use File | Settings | File    // Templates.  }  public boolean isClientTrusted(X509Certificate[] chain) {    return true;  }  public boolean isServerTrusted(X509Certificate[] chain) {    return true;  }  @Override  public X509Certificate[] getAcceptedIssuers() {    return _AcceptedIssuers;  }  public static void allowAllSSL() {    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {      @Override      public boolean verify(String arg0, SSLSession arg1) {        // TODO Auto-generated method stub        return true;      }    });    SSLContext context = null;    if (trustManagers == null) {      trustManagers = new TrustManager[] { new HTTPSTrustManager() };    }    try {      context = SSLContext.getInstance("TLS");      context.init(null, trustManagers, new SecureRandom());    } catch (NoSuchAlgorithmException e) {      e.printStackTrace();    } catch (KeyManagementException e) {      e.printStackTrace();    }    HttpsURLConnection.setDefaultSSLSocketFactory(context        .getSocketFactory());  }}

View Code
/** * A HttpStack implement witch can verify specified self-signed certification. * 验证指定的自签名证书。 */public class SelfSignSslOkHttpStack extends HurlStack {  private OkHttpClient okHttpClient;  /**   * Create a OkHttpStack with default OkHttpClient.   * 创建一个默认的okhttpclient okhttpstack。   */  public SelfSignSslOkHttpStack() {    this(new OkHttpClient());  }  /**   * Create a OkHttpStack with a custom OkHttpClient 创建一个自定义的okhttpclient okhttpstack   * @param okHttpClient Custom OkHttpClient, NonNull   */  public SelfSignSslOkHttpStack(OkHttpClient okHttpClient) {    this.okHttpClient = okHttpClient;  }  @Override  protected HttpURLConnection createConnection(URL url) throws IOException {    if ("http".equals(url.getProtocol())) {//如果请求是https请求那么就信任所有SSL,此处作了修改,无论是不是https都信任      HttpURLConnection connection = new OkUrlFactory(okHttpClient).open(url);//      SSLSocketFactory ssl = HTTPSTrustManager.allowAllSSL();//      connection.setSSLSocketFactory(ssl);      return connection;    } else {      return new OkUrlFactory(okHttpClient).open(url);    }  }}

View Code

请求管理类

public class RequestManager {  private static final String TAG = "RequestManager";  private static int SOCKET_TIMEOUT = 6 * 10 * 100;  private static RequestManager instance;  private Map<String, SSLSocketFactory> socketFactoryMap;  public static RequestManager getInstance(Context context) {    if (instance == null) {      instance = new RequestManager(context);    }    return instance;  }  public RequestQueue mRequestQueue;//  private OkHttpClient okHttpClient;  private BitmapLruCache mLruCache;  private ImageLoader mImageLoader;  private DiskBasedCache mDiskCache;  private RequestManager(Context context) {    int MEM_CACHE_SIZE = 1024 * 1024        * ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass() / 3;//    okHttpClient = new OkHttpClient();    mLruCache = new BitmapLruCache(MEM_CACHE_SIZE);    mRequestQueue = newRequestQueue(context.getApplicationContext());    mImageLoader = new ImageLoader(mRequestQueue, mLruCache);    mDiskCache = (DiskBasedCache) mRequestQueue.getCache();  }  private SSLSocketFactory createSSLSocketFactory(Context context, int res, String password)      throws CertificateException,      NoSuchAlgorithmException,      IOException,      KeyStoreException,      KeyManagementException {    InputStream inputStream = context.getResources().openRawResource(res);    KeyStore keyStore = KeyStore.getInstance("BKS");    keyStore.load(inputStream, password.toCharArray());    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());    tmf.init(keyStore);    SSLContext sslContext = SSLContext.getInstance("TLS");    sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());    return sslContext.getSocketFactory();  }  /**使用Volley首先需要获取到一个RequestQueue对象**/  private RequestQueue newRequestQueue(Context context) {    RequestQueue requestQueue;    try {//      String[] hosts = {CommonConfig.BASE_API};//      int[] certRes = {R.raw.kyfw};//      String[] certPass = {"asdfqaz"};//      socketFactoryMap = new Hashtable<>(hosts.length);//      for (int i = 0; i < certRes.length; i++) {//        int res = certRes[i];//        String password = certPass[i];//        SSLSocketFactory sslSocketFactory = createSSLSocketFactory(context, res, password);//        socketFactoryMap.put(hosts[i], sslSocketFactory);//      }      //用OKHttp替换HttpURLConnection作为传输层      HurlStack stack = new SelfSignSslOkHttpStack();      requestQueue = Volley.newRequestQueue(context, stack);      requestQueue.start();    } catch (Exception e) {      throw new RuntimeException(e);    }    return requestQueue;  }  public void addRequest(Request request, Object tag) {    if (BuildConfig.DEBUG) {      Log.i(TAG, "Add request:" + request.toString());    }    if (tag != null) {      request.setTag(tag);    }    mRequestQueue.add(request);  }  public void cancelAll(Object tag) {    mRequestQueue.cancelAll(tag);  }  public File getCachedImageFile(String url) {    return mDiskCache.getFileForKey(url);  }  public Bitmap getMemoryBitmap(String key) {    return mLruCache.get(key);  }  public ImageLoader.ImageContainer loadImage(String requestUrl,                        ImageLoader.ImageListener imageListener) {    return loadImage(requestUrl, imageListener, 0, 0);  }  public ImageLoader.ImageContainer loadImage(String requestUrl,                        ImageLoader.ImageListener imageListener,                        int maxWidth,                        int maxHeight) {    return mImageLoader.get(requestUrl, imageListener, maxWidth, maxHeight);  }  /**post请求**/  public static void PostString(String url, Context context,                 final Map<String, String> pams, Response.Listener<String> listener,                 Response.ErrorListener errListener) {    url = getAbsoluteUrl(url);    HTTPSTrustManager.allowAllSSL();    StringRequest request = new StringRequest(        Request.Method.POST,        url,        listener,        errListener    )    {      @Override      public Map<String, String> getHeaders() throws AuthFailureError {        // TODO Auto-generated method stub        return BaseApplication.getApplication()            .getHeaderparams();      }      @Override      public RetryPolicy getRetryPolicy() {        // TODO Auto-generated method stub        RetryPolicy retryPolicy = new DefaultRetryPolicy(            SOCKET_TIMEOUT, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);        return retryPolicy;      }      @Override      protected Map<String, String> getParams() throws AuthFailureError {        return pams;      }    };    // mRequestQueue.cancelAll();    // volley.jar    RequestManager.getInstance(context).addRequest(request, context);  }  private static String getAbsoluteUrl(String relativeUrl) {    return CommonConfig.BASE_API + relativeUrl;  }}

View Code

ui请求

private void login(){        OkVolleyService.Login("xxxxxxxx", "123", context, new OkVolleyService.ClientCallback() {          @Override          public void onSuccess(Object data) {            UsersEntity rEntity = (UsersEntity) data;            if (rEntity.reqResult.equals("success")) {              final UserEntity entity = rEntity.getData();              if (entity != null)                startActivity(new Intent(context, MainActivity.class));            }          }          @Override          public void onFailure(Exception e) {            Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();          }          @Override          public void onError(Exception e) {            Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();          }        });  }

View Code

学习笔记,只供参考,此处还可以优化,比如把网络回调去掉,改用rxandroid