android 网络篇简单介绍

本文简要介绍了Android开发中常见的网络工具,包括WebView的基本用法、JavaScript与Java交互技巧、Volley框架的使用及封装方法、JSON数据解析,以及图片加载库的选择与使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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图片下载缓存库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序编织梦想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值