常用Android框架总结
–power by 磷氢碳
Volley
Volley 是一个可让 Android 应用更轻松、(最重要的是)更快捷地联网的 HTTP 库。您可以在 GitHub 上获取 Volley。
Volley 具有以下优势:
- 自动网络请求调度。
- 多个并发网络连接。
- 透明磁盘和具有标准 HTTP 缓存一致性的内存响应缓存。
- 支持请求优先级。
- 取消请求 API。您可以取消单个请求,也可以设置要取消的请求的时间段或范围。
- 可轻松自定义,例如自定义重试和退避时间。
- 强大的排序功能,让您可以轻松使用从网络异步提取的数据正确填充界面。
- 调试和跟踪工具。
Volley 不适用于下载大量内容的操作或流式传输操作,因为在解析过程中,Volley 会将所有响应存储在内存中。
依赖使用
implementation 'com.android.volley:volley:1.1.1'
工具类
package com.lenovo.smarttraffic.util;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.lenovo.smarttraffic.InitApp;
import org.json.JSONException;
import org.json.JSONObject;
public class HttpUtils {
private static RequestQueue requestQueue = Volley.newRequestQueue(InitApp.getContext());
private JSONObject jsonObject = new JSONObject();
public HttpUtils add(String key, Object value) {
try {
jsonObject.put(key, value);
} catch (JSONException e) {
e.printStackTrace();
}
return this;
}
public interface SuccessCallBack {
void success(JSONObject jsonObject) throws Exception;
}
public interface ErrorCallBack {
void error(String message);
}
public static void post(String url, HttpUtils httpUtils, SuccessCallBack callback) {
String lonUrl = "http://10.0.2.2:8088/transportservice/" + url;//10.0.2.2
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
JsonObjectRequest.Method.POST, lonUrl,
httpUtils.jsonObject, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
callback.success(response);
} catch (Exception e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(InitApp.getContext(), error.toString(), Toast.LENGTH_SHORT).show();
}
});
requestQueue.add(jsonObjectRequest);
}
}
Okhttp
OkHttp是默认情况下有效的HTTP客户端:
- HTTP / 2支持允许对同一主机的所有请求共享一个套接字。
- 连接池可减少请求延迟(如果HTTP / 2不可用)。
- 透明的GZIP缩小了下载大小。
- 响应缓存可以完全避免网络重复请求。
当网络出现问题时,OkHttp会坚持不懈:它将从常见的连接问题中静默恢复。如果您的服务具有多个IP地址,则在第一次连接失败时,OkHttp将尝试使用备用地址。对于冗余数据中心中托管的IPv4 + IPv6和服务,这是必需的。OkHttp支持现代TLS功能(TLS 1.3,ALPN,证书固定)。可以将其配置为回退以获得广泛的连接性。
使用OkHttp很容易。它的请求/响应API具有流畅的构建器和不变性。它支持同步阻塞调用和带有回调的异步调用。
依赖
implementation("com.squareup.okhttp3:okhttp:4.9.0")
工具类
package com.phc.smartlinetv.utils;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import okhttp3.Call;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
public class HttpUtils {
private static final OkHttpClient client = new OkHttpClient();
public static Call netWork(String u, String method, Map<String, String> headers, RequestBody requestBody) {
if (headers == null) {
headers = new HashMap<>();
}
Request.Builder requestBuilder = new Request.Builder();
requestBuilder.url(u).method(method, requestBody);
for (String s : headers.keySet()) {
requestBuilder.addHeader(s, Objects.requireNonNull(headers.get(s)));
}
return client.newCall(requestBuilder.build());
}
}
Gson数据解析
Gson是一个Java库,可用于将Java对象转换为其JSON表示形式。它也可以用于将JSON字符串转换为等效的Java对象。Gson可以处理任意Java对象,包括您没有源代码的预先存在的对象。
有一些开源项目可以将Java对象转换为JSON。但是,大多数方法都要求您在类中放置Java注解。如果您无法访问源代码,则无法执行某些操作。大多数还不完全支持Java泛型的使用。Gson认为这两个都是非常重要的设计目标。
目标
- 提供简单的
toJson()
和fromJson()
方法,将Java对象到JSON,反之亦然 - 允许将已有的不可修改的对象与JSON相互转换
- Java泛型的广泛支持
- 允许对象的自定义表示
- 支持任意复杂的对象(具有深层继承层次结构和泛型类型的广泛使用)
依赖
implementation 'com.google.code.gson:gson:2.8.6'
使用方法
//将json解析为实体类
Clazz clazz = new Gson().fromJson(string, Clazz.class);
//将json解析为实体类第二种方法
List<Map<String, Objects>> mapList = new Gson().fromJson(string,
new TypeToken<List<Map<<String, Objects>>>() {
}.getType())
//将实体类转换为json
String s = new Gson().toJson(clazz);
图片处理框架Glide
Glide是适用于Android的快速高效的开源媒体管理和图像加载框架,它将媒体解码,内存和磁盘缓存以及资源池包装到一个简单易用的界面中。
依赖
implementation 'com.github.bumptech.glide:glide:4.12.0'
使用
Glide.with(context)
.load(url)
.into(imageview);
图表框架MpAndroidChart
MPAndroidChart 是 Android 系统上一款开源的图表库。目前提供线图和饼图,支持选择、缩放和拖放。
依赖
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
代码模块
private void onLineView(int[] item) {
ArrayList<Entry> yVals = new ArrayList<>();
for (int i = 0; i < item.length; i++) {
yVals.add(new Entry(i, item[i]));
}
LineDataSet lineDataSet = new LineDataSet(yVals, "0");
LineData data = new LineData(lineDataSet);
lineChar.setData(data);
lineChar.invalidate();
}
private void onPieView(int[] item) {
ArrayList<PieEntry> yVals = new ArrayList<>();
for (int i = 0; i < item.length; i++) {
yVals.add(new PieEntry(item[i]));
}
PieDataSet dataSet = new PieDataSet(yVals, "1");
int[] color = {0xffFFB6C1, 0xffEE82EE, 0xff0000FF, 0xffB0C4DE, 0xffAFEEEE};
dataSet.setColors(color);
PieData data = new PieData(dataSet);
pieChar.setData(data);
pieChar.setDrawHoleEnabled(false);
pieChar.setRotationEnabled(false);
pieChar.invalidate();
}
private void onBarView(int[] item) {
ArrayList<BarEntry> yVals = new ArrayList<>();
for (int i = 0; i < item.length; i++) {
yVals.add(new BarEntry(i, item[i]));
}
BarDataSet barDataSet = new BarDataSet(yVals, "2");
BarData data = new BarData(barDataSet);
barChar.setData(data);
barChar.invalidate();
}
WebView
声明网络权限
<uses-permission android:name="android.permission.INTERNET"/>
官方文档
https://developer.android.com/reference/android/webkit/WebView
使用方法
//允许js脚本
mWbContent.getSettings().setJavaScriptEnabled(true);
//这里注明js事件,callback为js中的对象名 callback.text(i);
mWbContent.addJavascriptInterface(this, "callback");
mWbContent.loadUrl("file:///android_asset/work1_web.html");
/**
* 这是js的事件事件回调
*
* @param index 参数由js中传出,这你传回来的是每个元素onClick的标志位
*/
@JavascriptInterface
public void onClick(int index) {
switch (index) {
case 1:
Toast.makeText(this, "点击了" + index, Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, "点击了" + index, Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(this, "点击了" + index, Toast.LENGTH_SHORT).show();
break;
case 4:
Toast.makeText(this, "点击了" + index, Toast.LENGTH_SHORT).show();
break;
case 5:
Toast.makeText(this, "点击了" + index, Toast.LENGTH_SHORT).show();
break;
case 6:
Toast.makeText(this, "点击了" + index, Toast.LENGTH_SHORT).show();
break;
case 7:
Toast.makeText(this, "点击了" + index, Toast.LENGTH_SHORT).show();
break;
case 8:
Toast.makeText(this, "点击了" + index, Toast.LENGTH_SHORT).show();
break;
case 9:
Toast.makeText(this, "点击了" + index, Toast.LENGTH_SHORT).show();
break;
}
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta charset="utf-8" />
<title></title>
<style>
.div {
width: 100px;
height: 100px;
background-color: #00ff00;
border-radius: 50px;
font-size: 20px;
text-align: center;
line-height: 100px;
float: left;
margin: 10px;
}
</style>
</head>
<body>
<div style="width: 100%;">
<div class="div" onclick="a(1)">试题1</div>
<div class="div" onclick="a(2)">试题2</div>
<div class="div" onclick="a(3)">试题3</div>
<div class="div" onclick="a(4)">试题4</div>
<div class="div" onclick="a(5)">试题5</div>
<div class="div" onclick="a(6)">试题6</div>
<div class="div" onclick="a(7)">试题7</div>
<div class="div" onclick="a(8)">试题8</div>
<div class="div" onclick="a(9)">创意题</div>
</div>
<script type="text/javascript">
function a(i) {
callback.onClick(i);
}
</script>
</body>
</html>