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