android 网络篇简单介绍
1 简介
本文简单介绍android 开发中常用的webview 、url、 volley、 json解析等网络工具。由于篇幅问题,这里只做简单介绍并不做详解。
2 WebView的用法
2.1 简单使用
在布局文件中添加webview:
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/webview"android:layout_width="fill_parent"android:layout_height="fill_parent"/>
加载数据:
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.baidu.com");
在menifest中添加请求网络权限:
<manifest ... ><uses-permission android:name="android.permission.INTERNET"/>
</manifest>
2.2 在webview中使用JavaScript
在webview中默认javaScript是不支持的,如果你的网页使用javaScript需要设置。
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
2.3 javaScrip调用java
当你嫌弃网页的alert太丑了!你想换成android中自定义的dialog如何做呢?步骤如下:
第一步:javaScript中调用java代码
<!DOCTYPE >
<html >
<head><script type="text/javascript">function init(testVal){AndroidFunction.showToast(testVal);}</script>
</head>
<body><input type="button" value="Say hello" onClick="javascript:return init('Hello Android!')" />
</body>
</html>
第二步:编写接口类:
public class WebAppInterface {Context mContext;/** Instantiate the interface and set the context */WebAppInterface(Context c) {mContext = c;}/** Show a toast from the web page */@JavascriptInterfacepublic void showToast(String toast) {Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();}
}
第三步调用代码如下:
webView = (WebView) findViewById(R.id.webView);WebSettings webSettings = webView.getSettings();webSettings.setJavaScriptEnabled(true);webView.addJavascriptInterface(new WebAppInterface(this), "AndroidFunction");webView.loadUrl("file:///android_asset/web.html");
注意:
java中的方法必须标注:“@JavascriptInterface”。
targetSdkVersion必须设置为17或更高。
2.4 设置页面导航
当点击网页中的button,如果你想转到自己的url页面。你需要给webview添加setWebViewClient(). 代码如下:
webView.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {if (url.equals("www.example.com")) {return false;}Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));startActivity(intent);return true;}
});
2.5 跳转web历史页
方法 | 介绍 |
---|---|
goBack() | |
goForward() | |
canGoForward() | 是否能goForward |
canGoBack | 是否能goBack |
方法我就不介绍了大家看看名字就明白了,我就不介绍了,怕把大家弄糊涂了。
2.6 小结
好了,webview就先简单介绍到这里,以后再补充。
3 使用HTTP协议访问网络
这块讲起来就说来话长了,这里就简单讲一下url简单使用。
3.1 URLConnection和URL
URL url = new URL(Constant.url);
HttpURLConnection coon = (HttpURLConnection) url.openConnection();
BufferedInputStream bis = new BufferedInputStream(coon.getInputStream());
...
coon可以设置很多属性。
...
coon可以设置很多属性,请参考这位大神的文章。
4 Volley的简单使用
4.1 Volley简介
Url和HttpURLConnection的用法是比较复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是android三界各路大神纷纷给出很多网络框架,这里我们给出一个轻量级网络框架Volley。Volley网络框架是2013年Google I/O大会上推出的。
4.2 volley使用场景
volley适用网络频繁,请求的数据量不大的情况。但是不适合大数据请求,如:文件下载。
4.3 volley使用步骤
1. 创建一个RequestQueue对象。
2. 创建一个StringRequest对象。
3. 将StringRequest对象添加到RequestQueue里面。
4.4 StringRequest的用法
volley用起来非常简单,我们先讲使用,后面我们对其二次封装。
步骤如下:
步骤1:首先需要获取到一个RequestQueue对象:
RequestQueue mQueue = Volley.newRequestQueue(context);
注意 这里拿到的RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,整个应用一个RequestQueue就行。
步骤2:创建StringRequest对象
StringRequest stringRequest = new StringRequest("http://www.baidu.com", new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("TAG", response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("TAG", error.getMessage(), error); } });
StringRequest的构造函数需要传入三个参数:
第一个参数就是目标服务器的URL地址
第二个参数是服务器响应成功的回调
第三个参数是服务器响应失败的回调。
我们在成功回调和失败回调分别打印一条信息。
步骤3 将这个StringRequest对象添加到RequestQueue
mQueue.add(stringRequest);
步骤4 效果图如下:
好了,使用就是这么简单。没错,我们把百度的html给打印出来了。
小结
我们再来总结一下volley的使用步骤:
1. 创建一个RequestQueue对象。
2. 创建一个StringRequest对象。
3. 将StringRequest对象添加到RequestQueue里面。
虽然简单,但是我们还要对其进行2次封装。
4.4 Volley封装
有一点大家一定要切记:
第三方框架一定要进行二次封装!!!
第三方框架一定要进行二次封装!!!
第三方框架一定要进行二次封装!!!
重要的话说3遍!即使框架使用再简单也要封装,为什么呢?
第一、第三方框架有不符合我们应用的地方。
第二、以防后面我们更换别的技术。
封装代码如下:
public class VolleyNetWorkUtils {/*** 2016年3月19日15:22:10* @author J_X* Volley运行应答返回结果的监听接口*/public interface VolleyResponseListener {/**设置当前网络请求结果*/void onResponse(String result, int flag);void onErrorResponse(VolleyError error);}/*** 网络请求链接*/private String requestUrl;/*** 网络请求参数*/private Map<String, String> paramsMap;/*** 网络请求Header设置*/private Map<String, String> headerMap;/*** 上下文资源引用*/private Context context;/*** 网络请求的TAG标示(主要用来取消网络请求)*/private String requestTag;/*** 网络请求应答结果的回调*/private VolleyResponseListener responseListener;/*** 网络请求方式POST\PUT\DELETE\GET\DEPRECATED_GET_OR_POST*/private int requestMethod = Method.POST;private int flag;private int outTime = -1;public VolleyNetWorkUtils(final Context c, final String url,int flag) {// TODO Auto-generated constructor stubthis.context = c;this.requestUrl = url;this.flag = flag;}//设置请求地址public void setRequestUrl(String requestUrl) {this.requestUrl = requestUrl;}//设置flagpublic void setFlag(int flag) {this.flag = flag;}/*** 设置网络请求监听* */public void setResponseListener(VolleyResponseListener listener) {this.responseListener = listener;}/*** 发送网络请求返回操作结果*/public void getNetworkJsonString() {StringRequest stringRequest = new StringRequest(this.requestMethod,this.requestUrl, new Response.Listener<String>() {@Overridepublic void onResponse(String result) {responseListener.onResponse(result,flag);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {responseListener.onErrorResponse(error);}}) {// 传递参数@Overrideprotected Map<String, String> getParams() throws AuthFailureError {if (paramsMap != null) {return paramsMap;}return super.getParams();}@Overridepublic Map<String, String> getHeaders() throws AuthFailureError {// TODO Auto-generated method stubif (headerMap != null) {return headerMap;}return super.getHeaders();}};// 设置网络请求标示if (!TextUtils.isEmpty(requestTag)) {stringRequest.setTag(stringRequest);}if(outTime > 0){stringRequest.setRetryPolicy(new DefaultRetryPolicy(outTime,DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));}// 将网络请求添加到请求队列中SingleRequestQueue.getRequestQueue(context).add(stringRequest);}/*** 设置网络请求参数,针对需要传递参数的请求方式,例如:POST方式提供* * @param paramsMap*/public void setParamsMap(Map<String, String> paramsMap) {this.paramsMap = paramsMap;}public void cancelRequst(String tag){SingleRequestQueue.getRequestQueue(context).cancelAll(tag);}/*** 对Http header有特殊要求的设置Header* * @param headerMap*/public void setHeaderMap(Map<String, String> headerMap) {this.headerMap = headerMap;}/*** 设置网络请求线程的标示,便于后期对线程进行操作* * @param requestTag*/public void setRequestTag(String requestTag) {this.requestTag = requestTag;}/*** 设置网络请求的方式:POST\PUT\DELETE\GET\DEPRECATED_GET_OR_POST* * @param requestMethod*/public void setRequestMethod(int requestMethod) {this.requestMethod = requestMethod;}public void setOutTime(int outTime) {this.outTime = outTime;}}
使用方法如下:
第一、activity实现VolleyNetWorkUtils.VolleyResponseListener接口
第二、使用代码如下:
String meetingListUrl = "http://www.baidu.com";
VolleyNetWorkUtils volleyNetWorkUtils = new VolleyNetWorkUtils(MeetingActivity.this, meetingListUrl,GetMeetingListFlag);HashMap<String, String> params = new HashMap<String, String>();params.put("app_key", getKey());volleyNetWorkUtils.setParamsMap(params);//设置参数volleyNetWorkUtils.setResponseListener(this);//设置回调volleyNetWorkUtils.getNetworkJsonString();//开始请求数据
是不是使用起来非常简单。
5 Json解析
json解析是最常用的东西,必须要掌握。这里我们针对3种格式给出解析方法,并在最后用Gson都大家自动解析。
5.1 Json家族常用的类
android的json解析部分都在包org.json下,主要有以下几个类:
JSONObject类:
JSONArray类:
5.2 解析方法讲解
1. { ,,,,}键值方式
{"class_id": "1","class_name": "小区美食","class_image":"http://yx.gyp.com/data/upload/o2o/merchant_class/04914995980469188.png"
}
类似于这种的格式如何解析呢?解析代码如下:
try {JSONObject jo = new JSONObject(Jsonstr);String class_id = jo.optString("class_id");String class_name = jo.optString("class_name");String class_image = jo.optString("class_image");} catch (JSONException e) {e.printStackTrace();}
2 { [{,,},{,,}]} 数组方式
{"store_class": [{"class_id": "1","class_name": "小区美食","class_image": "http://yx.gyp.com/data/upload/o2o/merchant_class/04914995980469188.png"},{"class_id": "2","class_name": "便利店","class_image": "http://yx.gyp.com/data/upload/o2o/merchant_class/04913371801531952.png"}]
}
这种是列表的解析,代码如下:
try {JSONObject jo = new JSONObject(jsonStr);JSONArray store_classJsonArray = jo.optJSONArray("store_class");for(int i = 0; i < store_classJsonArray.length(); i++){JSONObject store_classJo = store_classJsonArray.optJSONObject(i);String class_id = store_classJo.optString("class_id");String class_name = store_classJo.optString("class_name");String class_image = store_classJo.optString("class_image");}} catch (JSONException e) {e.printStackTrace();}
3 {[,,,,]}直接一个数组
{"store_class": ["小区美食","便利店",]}
这个是数组的字符串,解析如下:
try {JSONObject jo = new JSONObject(jsonStr);JSONArray store_classJsonArray = jo.optJSONArray("store_class");for(int i = 0; i < store_classJsonArray.length(); i++){String str = store_classJsonArray.optString(i);}} catch (JSONException e) {e.printStackTrace();}
4 特殊情况的解析
上面的解析的3种情况有一个共同点:key是不变的。但是如果key和value都变的话就不好解析了,我特别把这种情况摘出来。
{"space":{"质量":"1kg","颜色":"黄色","长度":"1米",}}
这种显示规格的json字符串典型的key和value都在变的情况。解析如下:
JSONObject jo = new JSONObject("");Iterator<String> iterator = jo.keys();while(iterator.hasNext()){String key = iterator.next();String value = jo.optString(key);}
5.3 GsonFormat快速实现实体类解析
GsonFormat是AndroidStudio的一个插件,需要安装。
安装:
安装成功后,新建一个类,按Alt + Insert 键出现下面图:
点击GsonFormat后出现下面界面:
粘贴上json字符串后,点击OK:
最后就自动解析好了,真是太方便了!自动有了这个玩意我再也没自己解析过!
6 图片加载
图片加载当前有经有成熟的框架了,已经不需要我们自己写了。介绍一下当前流行的图片加载框架:
名称 | 适应情况 |
---|---|
Picasso | 体积会小很多,适应于小应用 |
Glide | 处理大型的图片流,比如gif、Video,做美拍、爱拍这种视频类应用 |
Fresco | 内存优化非常好,但是体积大 |
Universal-Image-Loader | 停止维护了,不建议使用 |
这里我们着重介绍一下Picasso的使用:
添加包:
compile 'com.squareup.picasso:picasso:2.5.2'
使用起来非常简单:
Picasso.with(context).load(url)//图片地址.resize(50, 50)//图片大小.centerCrop()//图片展示类型.into(imageView);//设置进图片
Picasso.with(context).load(url)//图片地址.resize(50, 50)//图片大小.centerCrop()//图片展示类型.into(imageView);//设置进图片
详细使用我们参考这篇文章
7 结尾
好了,就介绍到这里吧,本篇只是抛砖引玉的做简单的介绍,很多地方没有详细展开,希望对大家有所帮助。如果觉的不错请点个赞吧。
在技术上我依旧是个小渣渣,加油!勉励自己!
8 参考文档
【1】官网
【2】android webView 的WebSettings说明
【3】Android中HttpURLConnection使用详解
【4】 Android Volley完全解析
【5】picasso-强大的Android图片下载缓存库
android 网络篇简单介绍相关推荐
- iOS开发UI篇—简单介绍静态单元格的使用
iOS开发UI篇-简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...
- 公司网络架构简单介绍
公司网络架构简单介绍 公司服务器架构简单介绍: CDN:租用的,用于提高用户访问速度 前边两台LVS:实现负载均衡和高可用 三台Nginx服务器提供Web服务 三台Tomcat服务器当动态Web服务 ...
- (一)Ns3网络仿真软件简单介绍
(一)Ns3网络仿真软件简单介绍 1. 什么是NS-3? NS是一个开源离散事件驱动网络模拟器.官方定义:(fromhttp://www.nsnam.org/) ns-3 is a discrete ...
- Android网络篇
http://blog.csdn.net/u011014707/article/details/46584347 针对互联网设计的操作系统,网络编程.多媒体编程.基础框架构成了Android平台应用开 ...
- [深度学习-原理]GAN(生成对抗网络)的简单介绍
系列文章目录 深度学习GAN(一)之简单介绍 深度学习GAN(二)之DCGAN基于CIFAR10数据集的例子 深度学习GAN(三)之DCGAN基于手写体Mnist数据集的例子 深度学习GAN(四)之c ...
- Android逆向工具简单介绍
目录 一.Android逆向概述 1.什么是Android逆向 2.逆向过程 3.逆向用途 1)APP自动化执行程序脚本 2)修改APP的功能 3)APP安全 二.常用逆向工具介绍 1.APP抓包工具 ...
- Android事件分发简单介绍
简单的讨论下关于Android的事件分发,其实网上的介绍很多,但是每次看完我都记的很晕,而我也只想知道当不同的返回值事件走的流程,所以这也只为自己做个简单的记录 首先说一下关于事件分发ViewGrou ...
- Android IBinder机制简单介绍
原理简介 我们都知道android 是通过IBinder来实现IPC(Inter Process Communication)进程间通信的... 参考:Android进程间通信(IPC)机制Binde ...
- Docker网络模式简单介绍
1 简介 docker常见的网络模式有5种,分别为 bridge:Docker中默认的网络驱动模型,在启动容器时如果不指定则默认为此驱动类型: host:打破Docker容器与宿主机之间的网络隔离,直 ...
最新文章
- XCode 导入头文件不提示解决
- UITableView的cell向左滑出有删除,修改等选项
- python中import os_python import os
- 居家洁士扫地机器人_掌握核心技术扫地机器人品牌推荐,由利和石头扫地机器人哪个牌子好?...
- 光模块是怎么分类的?光模块的应用及作用有哪些?
- c构造函数和析构函数_C ++构造函数和析构函数| 查找输出程序| 套装3
- Null对象模式的用法
- 杭电1710 (已知二叉树前中序 求后序)
- Spring事务管理(注解式声明事务管理)备忘
- 今日恐慌与贪婪指数为83 贪婪程度大幅上升
- 阿里云nginx站点http升级https
- 通过哈希MD5实现加密(python3.X)
- python获取扫描枪数据线_【转】C#中判断扫描枪输入与键盘输入
- **一些常用的字体英文名**
- 一款商城APP开发要多少钱?
- python提取cad中的文字_[python]提取PPT中的文字(包括图片中的文字)
- 传世藏书 医部目录(1-6册)
- Win系统下快速批量截图
- 偷天换日合约易主,地址变脸移花接木——底层函数误用漏洞 | 漏洞分析连载之四...
- 4G技术哪家强?说清楚FDD和TDD之间的事
热门文章
- 概率论中常见分布总结以及python的scipy库使用:两点分布、二项分布、几何分布、泊松分布、均匀分布、指数分布、正态分布...
- 《贪心算法》— NYOJ 1309 冰法斗神龙
- ROS读取手机GPS数据(1)
- jquery 中加入html代码,jquery实现动态添加html代码
- java 权重随机数算法
- 装饰模式(Decorator模式)详解
- java判断指定路径文件夹是否存在,若不存在则创建新的文件夹,存在则删除
- 5G基础以及发展简介
- 浦发银行重庆分行信息科技岗校招面试
- alios thing 信号量_操作系统100问