常用Android框架总结

 

常用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>