Volley网络通信框架
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="org.mobiletrain.a7_3volley.MainActivity"> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="getString1"
android:text="请求字符串"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="getJsonObject"
android:text="请求一个Json数据"/> <TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
public class MainActivity extends AppCompatActivity { private RequestQueue queue;
private TextView tv;
private ImageView iv;
private String imageUrl; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageUrl = "http://a.hiphotos.baidu.com/news/q%3D100/sign=e5edcefd9558d109c2e3adb2e159ccd0/0ff41bd5ad6eddc4696319783edbb6fd536633a8.jpg";
queue = Volley.newRequestQueue(this);
tv = ((TextView) findViewById(R.id.tv));
iv = ((ImageView) findViewById(R.id.iv));
} public void getString1(View view) {
//如果不指定请求方式,默认为Get请求
StringRequest request = new StringRequest("http://www.baidu.com", new Response.Listener<String>() {
//当请求成功时回调该方法
@Override
public void onResponse(String response) {
tv.setText(response);
Log.d("lenve", "onResponse: response:" + response);
}
}, new Response.ErrorListener() {
//请求失败时回调
@Override
public void onErrorResponse(VolleyError error) { }
});
//将请求添加到队列中去
queue.add(request);
} public void getJsonObject(View view) {
//第二参数表示传递给服务器的参数,如果第二参数为null,即不需要给服务端传递参数,此时的请求方式为get请求,否则为post请求
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://www.tngou.net/api/food/classify", null, new Response.Listener<JSONObject>() {
//请求成功时回调的方法
@Override
public void onResponse(JSONObject response) {
StringBuffer result = new StringBuffer();
try {
JSONArray tngou = response.getJSONArray("tngou");
for (int i = 0; i < tngou.length(); i++) {
result.append(tngou.getJSONObject(i).getString("name") + "\n");
}
tv.setText(result.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) { }
});
queue.add(jsonObjectRequest);
} public void getJsonArray(View view) {
//请求JsonArray数据
JsonArrayRequest arrayRequest = new JsonArrayRequest("http://www.tngou.net/api/food/classify", new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.d("lenve", "onResponse: " + response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("lenve", "onErrorResponse: error:" + error.getMessage());
}
});
queue.add(arrayRequest);
} public void getImage(View view) {
//1.图片地址
//2.图片加载成功的回调
//3.图片的最大宽度
//4.图片的最大高度
//5.图片缩放模仿
//6.加载图片的色彩模式
//7.加载失败时的回调
ImageRequest imageRequest = new ImageRequest(imageUrl, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
iv.setImageBitmap(response);
}
}, 200, 200, ImageView.ScaleType.CENTER_CROP, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) { }
});
queue.add(imageRequest);
} public void imageloader(View view) {
BitmapCache imageCache = new BitmapCache(this);
//1.请求队列
//2.图片缓存工具类
ImageLoader imageLoader = new ImageLoader(queue, imageCache);
//1.显示下载图片的ImageView控件
//2.默认图片
//3.下载出错时显示的图片
ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(iv, R.mipmap.ic_launcher, R.mipmap.ic_launcher);
//1.请求的图片地址
//2.监听器
imageLoader.get(imageUrl, imageListener);
}
}
public class BitmapCache implements ImageLoader.ImageCache { private LruCache<String, Bitmap> lruCache;
private Context context; public BitmapCache(Context context) {
this.context = context;
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int maxSize = maxMemory / 8;
lruCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
};
} @Override
public Bitmap getBitmap(String url) {
Bitmap bitmap = lruCache.get(subUrl(url));
if (bitmap != null) {
return bitmap;
} else {
bitmap = getBitmapFromSDCard(subUrl(url));
if (bitmap != null) {
lruCache.put(subUrl(url), bitmap);
}
return bitmap;
}
} private Bitmap getBitmapFromSDCard(String s) {
return BitmapFactory.decodeFile(context.getExternalCacheDir().getAbsolutePath() + File.separator + s);
} private String subUrl(String url) {
return url.substring(url.lastIndexOf("/") + 1, url.length());
} @Override
public void putBitmap(String url, Bitmap bitmap) {
lruCache.put(subUrl(url), bitmap);
saveBitmap2SDCard(subUrl(url), bitmap);
} private void saveBitmap2SDCard(String url, Bitmap bitmap) {
//如果SD卡中已经有了图片,则不需要再保存
Bitmap bitmapFromSDCard = getBitmapFromSDCard(url);
if (bitmapFromSDCard != null) {
return;
}
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(new File(context.getExternalCacheDir(), url)));
if (url.toLowerCase().contains(".png")) {
//如果第一个参数为PNG,第二个参数无意义
bitmap.compress(Bitmap.CompressFormat.PNG, 0, bos);
} else {
//如果第一个参数为JPEG,则第二个参数会影响图片的质量,第二个参数取值(0~100),值越大,图片质量越高
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
使用步骤:
第一步:创建请求队列(一般创建一次即可)RequestQueue mQueue = Volley.newRequestQueue(this);
第二步:根据业务需要创建一个请求
StringRequest sr = new StringRequest(XXX);
JsonObjectRequest jsonReq = new JsonObjectRequest(XXX);
JsonArrayRequest arrayRequest = new JsonArrayRequest(XXX);
ImageRequest imageRequest = new ImageRequest(XXX); ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
ImageListener listener = ImageLoader.getImageListener(imageView,
R.drawable.ic_launcher, R.drawable.ic_launcher);
imageLoader.get(IMAGEURL, listener); ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
networkImageView.setImageUrl(IMAGEURL,imageLoader);
第三步:将请求加入到请求队列中
mQueue.add(对象);
Volley和Okhttp的区别
Volley支持并发网络连接,支持同时取消单个或多个请求,还可以轻松的发送异步请求来填充UI数据。拥有请求任务队列管理,适合小而频繁的请求。对于请求大数据,比如下载文件,Volley不太合适
Okhttp使用线程池技术减少请求的延迟,无缝的支持GZIP来减少数据流量,缓存响应数据来减少重复的网络请求。而且弥补了Volley的不足,比如,Volley默认不支持文件的上传,而Okhttp提供了多文件上传功能
Okhttp缺点:消息回来需要切到主线程,主线程要自己去写,第二传入调用比较复杂
Volley网络通信框架的更多相关文章
- Android开发之Volley网络通信框架
今天用了一下Volley网络通信框架,感觉挺好用的,写个博客记录一下用法.方便以后VC. Volley(Google提供的网络通信库,能使网络通信更快,更简单,更健壮.) 功能模块: 1. JSON, ...
- Android应用框架-Volley网络通信框架
1.Volley简介: Volley是Google 推出的 Android 异步网络请求框架和图片加载框架. 在 Google I/O 2013 大会上发布. 2.Volley特点 扩展性强. And ...
- Android-Volley网络通信框架(自己定义Request 请求:实现 GsonRequest)
1.回想 上篇学习了android 通过 volley 网络通信框架 实现 请求图片的三种方法! 2.重点 (1)复习和熟悉 StringRequest ,JsonObjectRequest 方法 ( ...
- Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))
1.回想 上篇 使用 Volley 的 JsonObjectRequest 和 ImageLoader 写了 电影列表的样例 2.重点 (1)封装Volley 内部 请求 类(请求队列,数据请求,图片 ...
- 强大的网络通信框架(实现缓存)--第三方开源--volley
Android Volley是Android平台上很好用的第三方开源网络通信框架.使用简答,功能强大. Android Volley的库jar包Volley.ja下载连接地址:Volley下载 下载后 ...
- 网络通信框架之volley
介绍 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行HTTP通信,Htt ...
- 网络通信框架Retrofit2
网络通信框架Retrofit2 1 概要 Retrofit2的简介以及特点 Retrofit2使用配置(导包,权限等) Retrofit2中常用的注解介绍 Retrofit2实现http网络访问 GE ...
- c#网络通信框架networkcomms内核解析 序言
NetworkComms网络通信框架序言 networkcomms是我遇到的写的最优美的代码,很喜欢,推荐给大家:) 基于networkcomms2.3.1开源版本( gplv3)协议,写了一些文章, ...
- c#网络通信框架networkcomms内核解析之十 支持优先级的自定义线程池
NetworkComms网络通信框架序言 本例基于networkcomms2.3.1开源版本 gplv3协议 如果networkcomms是一顶皇冠,那么CommsThreadPool(自定义线程池 ...
随机推荐
- luogu P1627 [CQOI2009]中位数
传送门 要求有多少个长度为奇数的区间满足某个数为区间中位数 这样的区间,大于中位数的数个数 等于 小于中位数的数个数 用类似于前缀和的方法,设\(X_i\)为\(i\)和数\(b\)形成的区间内,大于 ...
- python - class类 (三) 类的组合
类的组合: #组合 class A1(): def pr(self): return 'a1' class A2(): def pr(self): return 'a2' class A3(): de ...
- 11、Logback日志框架介绍和SpringBoot整合实战 2节课
1.新日志框架LogBack介绍 简介:日志介绍和新日志框架Logback讲解 1.常用处理java的日志组件 slf4j,log4j,logback,common-logging 等 ...
- 基于神经网络的颜色恒常性—Fully Convolutional Color Constancy with Confidence-weighted Pooling
论文地址: http://openaccess.thecvf.com/content_cvpr_2017/papers/Hu_FC4_Fully_Convolutional_CVPR_2017_pap ...
- STM32F103X datasheet学习笔记---USART
1.前言 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择. 它支持同步 ...
- ES系列十四、ES聚合分析(聚合分析简介、指标聚合、桶聚合)
一.聚合分析简介 1. ES聚合分析是什么? 聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值.最小值,计算和.平均值等.ES作为 ...
- ajax模拟获取json
现在工作中我用到获取数据的方式,基本都是ajax.前台获取后端的数据后,需要进行处理,然后把他们放进页面中的相应标签里.下面举一个简单的例子,来模拟数据的获取和摆放. 这里用ng框架获取数据然后处理, ...
- S5PV210 ADC转换
第一节 S5PV210的ADCS5PV210的ADC可支持10bit和12bit,它支持10路输入,然后将输入的模拟的信号转换为10bit或者12bit的二进制数字信号.在5MHz的时钟下,最大转换速 ...
- 脚本检测CDN节点资源是否与源站资源一致
需求: 1.所有要检测的资源url放到一个单独文件中 2.检测cdn节点资源大小与源站文件大小是否一致 3.随机抽查几个资源,检查md5sum是否一致 4.使用多线程,可配置线程数 代码目录: hex ...
- jmeter之使用代理录制脚本
从loadrunner到jmeter,录制压力测试脚本好像都只支持IE,近来才知道jmeter还有自带的录制脚本元件, 且支持IE.Chrome及Firefox等多种浏览器.这里就记录一下通过jmet ...