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历史页

方法 介绍 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 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 体积会小很多,适应于小应用 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图片下载缓存库

0 0