android 网络篇简单介绍
来源:互联网 发布:登陆淘宝号 编辑:程序博客网 时间:2024/05/23 23:38
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 */ @JavascriptInterface public 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(){ @Override public 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历史页
方法我就不介绍了大家看看名字就明白了,我就不介绍了,怕把大家弄糊涂了。
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 stub this.context = c; this.requestUrl = url; this.flag = flag; } //设置请求地址 public void setRequestUrl(String requestUrl) { this.requestUrl = requestUrl; } //设置flag public 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>() { @Override public void onResponse(String result) { responseListener.onResponse(result,flag); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { responseListener.onErrorResponse(error); } }) { // 传递参数 @Override protected Map<String, String> getParams() throws AuthFailureError { if (paramsMap != null) { return paramsMap; } return super.getParams(); } @Override public Map<String, String> getHeaders() throws AuthFailureError { // TODO Auto-generated method stub if (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的使用:
添加包:
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 网络篇简单介绍
- Android 网络开源库-Retrofit(一)简单介绍
- Android 网络开源库-Retrofit(一)简单介绍
- Android网络请求HTTP简单介绍
- 十五.Android网络通信与Volley简单介绍
- UDT网络协议简单介绍
- SOCKET网络编程(简单介绍)
- IOS网络编程简单介绍
- 简单的网络协议介绍
- OKHttp网络请求简单介绍
- OKHttp网络请求简单介绍
- Android学习篇:适配器简单介绍
- android animation 简单介绍
- android 动画简单介绍
- Android的简单介绍
- Android 模拟器简单介绍
- [Android Makefile] 简单介绍
- android ViewStub简单介绍
- Java基础知识总结-补充
- OPENCV之从calibrateCamera到solvePnP(一)
- 备忘录模式(17)
- NOIp2012开车旅行
- SLAM学习
- android 网络篇简单介绍
- Spring简介
- 如何解决HTML5页面js,css缓存问题
- android 多媒体——音乐播放器
- 洛谷 1051——谁拿了最多奖学金(排序Ex)
- 关于淘宝镜像cnpm的一些解决问题
- 寒假篇18
- Web前端技术 自学or老师授课更靠谱
- Codeforcess 535C Tavas and Karafs【二分+思维】