使用okhttp加载服务器数据,Glide加载图片
2017-09-25 11:54
405 查看
使用okhttp加载服务器数据,Glide加载图片
网项目中导入glide-3.6.1.jar okhttp-3.2.0.jar okio-1.11.0.jar架包;GlideCache实现GlideModule类,这个类主要实现的是图片缓存的路劲和缓存的大小
图片缓存类实现
public class GlideCache implements GlideModule{ @Override public void applyOptions(Context context, GlideBuilder builder) { // TODO Auto-generated method stub builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565); File storageDirectory=Environment.getExternalStorageDirectory(); String download=storageDirectory+ File.separator + "文件夹名称" + File.separator; int cacheSize=100*1000*1000; builder.setDiskCache(new DiskLruCacheFactory(download, cacheSize)); } @Override public void registerComponents(Context arg0, Glide arg1) { // TODO Auto-generated method stub } }
3、实现图片缓存的数据后再AndroidManifest.xml文件中进行注册
<meta-data android:name="包名.GlideCache" android:value="GlideModule" />
4、建立一个公共的图片下载工具类,方便下载图片调用
public class ImageLoader { /** * 图片下载无缓存 * * @param context * 上下文 * @param url * 图片地址(是gif显示gif文件) * @param imageView * 显示图片控件 */ public static void loadImageNoCache(Context context, String url, ImageView imageView) { if (url != null) { if (url.contains(". 4000 gif")) { Glide.with(context).load(url).asGif() .diskCacheStrategy(DiskCacheStrategy.NONE) .into(imageView); } else { Glide.with(context).load(url).crossFade() .diskCacheStrategy(DiskCacheStrategy.NONE) .into(imageView); } } } /** * 图片下载有缓存 * * @param context * 上下文 * @param url * 图片地址(是gif显示gif文件) * @param imageView * 显示图片控件 */ public static void loadImageHaveCache(Context context, String url, ImageView imageView) { if (url.contains(".gif")) { Glide.with(context).load(url).asGif() .diskCacheStrategy(DiskCacheStrategy.SOURCE) .into(imageView); } else { Glide.with(context).load(url) .diskCacheStrategy(DiskCacheStrategy.SOURCE) .into(imageView); } } /** * 加载资源文件中的图片 * * @param context * 上下文 * @param resourseId * 资源文件ID * @param imageView * 显示图片控件 */ public static void showImage(Context context, int resourseId, ImageView imageView) { Glide.with(context).load(resourseId) .diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView); } /** * 加载资源文件中的图片 * * @param context * 上下文 * @param resourseId * 资源文件ID * @param imageView * 显示图片控件 */ public static void showImageGif(Context context, int resourseId, ImageView imageView) { Glide.with(context).load(resourseId).asGif() .diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView); } /** * 加载资源文件中的图片 * * @param context * 上下文 * @param resourseId * 资源文件ID * @param imageView * 显示图片控件 */ public static void showOneGif(Context context, int resourseId, ImageView imageView) { Glide.with(context).load(resourseId).into(imageView); } /** * @param context * 上下文 * @param url * 图片地址 * @return 根据地址返回bitmap文件 */ public static void getBitmap(final Context context, final String url, final BitmapCallBack callBack) { Glide.with(context).load(url).asBitmap() .into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap bitmap, @SuppressWarnings("rawtypes") GlideAnimation anim) { callBack.callback(bitmap); } }); } public interface BitmapCallBack { void callback(Bitmap bitmap); } }
5、建立一个使用okhttp访问服务器的公共的get和post方法
/** * Created by Administrator on 2017/4/24 0024. 访问服务器基类 */ public class NetCall { public static OkHttpClient client; public static NetCall instance; public static NetCall getInstance(Context context) { if (instance == null) { synchronized (NetCall.class) { if (instance == null) { instance = new NetCall(context); return instance; } } } return instance; } public NetCall(Context context) { // 设置okhttp框架信任所有证书,访问到https地址 OkHttpClient.Builder build = new OkHttpClient.Builder(); build.sslSocketFactory(createSSLSocketFactory()); build.hostnameVerifier(new TrustAllHostnameVerifier()); client = build.cache(new Cache(context.getCacheDir(), 200)) .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS).build(); } /** * 信任所有证书,返回true */ private static class TrustAllHostnameVerifier implements HostnameVerifier { @Override public boolean verify(String hostname, SSLSession session) { return true; } } private static SSLSocketFactory createSSLSocketFactory() { SSLSocketFactory ssl = null; try { SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[] { new TrustAllCerts() }, new SecureRandom()); ssl = sslContext.getSocketFactory(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } return ssl; } private static class TrustAllCerts implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } /** * okhttp GET()方法访问 * * @param params * 访问服务器参数 * @param callBack * 监听服务器返回数据 */ public <T> void get(Map<String, String> params, final UIReFlashHandle<T> handle) { StringBuilder stringBuilder = new StringBuilder(); if (params != null && params.size() > 0) { Set<Map.Entry<String, String>> set = params.entrySet(); for (Map.Entry<String, String> entry : set) { stringBuilder.append(entry.getKey()); stringBuilder.append("="); try { stringBuilder.append(URLEncoder.encode(entry.getValue(), "utf-8")); stringBuilder.append("&"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } stringBuilder.deleteCharAt(stringBuilder.length() - 1); final Request request = new Request.Builder() .url(Config.URL + stringBuilder.toString()).get().build(); // 访问接口参数打印 LogUtils.LogURL("访问服务器参数", request.url().toString()); client.newCall(request).enqueue(new Callback() { @SuppressWarnings("unchecked") @Override public void onResponse(Call arg0, Response response) throws IOException { if (response.isSuccessful() && handle != null) { String json = response.body().string(); LogUtils.Log("返回服务器数据", json); if (!TextUtils.isEmpty(json)) { try { JSONObject object = new JSONObject(json); switch (object.getInt(Config.STATUS)) { case Config.SUCCESS: // status==1 获取信息成功 Gson gson = new Gson(); Type type = handle.type; if (type == String.class) { Message message = new Message(); message.what = UIReFlashHandle.SUCCESS; message.obj = (T) json; handle.sendMessage(message); } else { T t = gson.fromJson(json, type); Message message = new Message(); message.what = UIReFlashHandle.SUCCESS; message.obj = t; handle.sendMessage(message); } break; case Config.FAILED: // status==0 获取失败,提示各种信息 Message message = new Message(); message.what = UIReFlashHandle.FAILED; message.obj = object.getString(Config.MSG); handle.sendMessage(message); break; default: break; } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { Message message = new Message(); message.what = UIReFlashHandle.FAILED; message.obj = "获取信息失败"; handle.sendMessage(message); } } } @Override public void onFailure(Call arg0, IOException arg1) { // TODO Auto-generated method stub Message message = new Message(); message.what = UIReFlashHandle.NONET; message.obj = "网络问题"; LogUtils.Log("返回服务器数据", "网络问题"); handle.sendMessage(message); } }); } } /** * okhttp POST()方法访问 * * @param params * 访问服务器参数 * @param callBack * 监听服务器返回数据 * @param <T> * 返回的数据类型 */ public <T> void post(Map<String, String> params, final UIReFlashHandle<T> handle) { FormBody.Builder builder = new FormBody.Builder(); if (params != null && params.size() > 0) { for (String key : params.keySet()) { builder.add(key, params.get(key)); } } final Request request = new Request.Builder().url(Config.URL) .post(builder.build()).build(); // 访问数据打印 LogUtils.LogURL("访问服务器参数", request.url().toString() + params.toString()); client.newCall(request).enqueue(new Callback() { @SuppressWarnings("unchecked") @Override public void onResponse(Call arg0, Response response) throws IOException { if (response.isSuccessful() && handle != null) { String json = response.body().string(); LogUtils.Log("返回服务器数据", json.toString()); if (!TextUtils.isEmpty(json)) { try { JSONObject object = new JSONObject(json); switch (object.getInt(Config.STATUS)) { case Config.SUCCESS: // status==1 获取信息成功 Gson gson = new Gson(); Type type = handle.type; if (type == String.class) { Message message = new Message(); message.what = UIReFlashHandle.SUCCESS; message.obj = (T) json; handle.sendMessage(message); } else { T t = gson.fromJson(json, type); Message message = new Message(); message.what = UIReFlashHandle.SUCCESS; message.obj = t; handle.sendMessage(message); } break; case Config.FAILED: // status==0 获取失败,提示各种信息 Message message = new Message(); message.what = UIReFlashHandle.FAILED; message.obj = object.getString(Config.MSG); handle.sendMessage(message); break; default: break; } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { Message message = new Message(); message.what = UIReFlashHandle.FAILED; message.obj = "获取用户失败,请重试"; handle.sendMessage(message); } } } @Override public void onFailure(Call arg0, IOException arg1) { // TODO Auto-generated method stub Message message = new Message(); message.what = UIReFlashHandle.NONET; message.obj = "网络问题"; handle.sendMessage(message); } }); } }
6、因为okhttp获取服务器的内容不能再主线程中使用,其中的UIReFlashHandle的方法就是建立一个子线程,用于数据显示在页面之中
public class UIReFlashHandle<T> extends Handler { // 解析数据成功 public static final int SUCCESS = 1; // 解析数据失败 public static final int FAILED = 0; // 网络出错 public static final int NONET = -1; protected MyDataListener<T> listener; protected Type type; public UIReFlashHandle(MyDataListener<T> listener, Type type) { this.listener = listener; this.type = type; } /* * @param msg * * @Descrition: */ @SuppressWarnings("unchecked") @Override public void handleMessage(Message msg) { switch (msg.what) { case SUCCESS: listener.onSuccess((T) msg.obj); break; case FAILED: listener.onFailed((String) msg.obj); break; case NONET: listener.onErrorNet((String) msg.obj); break; default: break; } } }
/** * @author Administrator * @param <T> 数据类型 * @time:2017-5-26 下午2:39:09 * @Descrition: 返回数据监听 */ public interface MyDataListener<T> { abstract void onErrorNet(String msg); abstract void onFailed(String msg); abstract void onSuccess(T t); }
7、具体的访问服务器数据方法如下
private void GetData() { HashMap<String,String>hashMap=new HashMap<>(); hashMap.put("参数", "参数值"); ... NetCall.getInstance(this).get(Select, new UIReFlashHandle<>(new MyDataListener<返回值解析的基本类>() { @Override public void onErrorNet(String msg) { //无网络时提示信息 } @Override public void onFailed(String msg) { //查询服务器数据出错 } @Override public void onSuccess(SelectLinkageBean t) { //查询服务器数据成功 } } }, 返回值解析的基本类.class)); }
相关文章推荐
- SSS___listview多条目加载、使用okhttp请求网络数据,Glide加载图片
- Recyclerview 列表中 使用Glide加载图片,下拉 或者上拉 加载数据,图片闪 烁 ,
- 使用recyclerview多条目加载代替listview okhttp请求网路 Glide加载图片
- Android使用OKHTTP网络框架请求数据,RecyclerView结合Glide展示图片,瀑布流布局样式
- OkHttp解析数据,RecyclerView和Glide的加载图片
- Glide 使用OkHttp加载图片源码分析
- Android图片加载框架Glide使用总结
- Android使用HttpClient加载网络数据(图片)
- 关于监听器的使用(服务器启动时加载数据)
- Volley框架的使用(加载网络图片,加载json数据)
- PHP使用CURL向服务器POST文本数据和上传图片的代码示例
- 使用开源框架 Glide 加载与缓存图片
- Android开发:使用Glide动态加载圆形图片和圆角图片--图片开发框架
- android glide 图片加载框架使用
- Android 平滑图片加载和缓存库 Glide 使用详解
- iOS开发使用tableView从服务器加载图片时的卡顿现象解决方案
- Android开发:使用Glide动态加载圆形图片和圆角图片
- js图片预加载---for与onload事件,图片数据模型到界面的单项绑定,使用interval模拟循环操作
- goolge官方推荐图片加载框架glide使用介绍
- 使用ajax()方法加载服务器数据