Android开发工作随笔(2019.4.15)浮点型除法精确计算 、not permitted by network security policy、Retrofit修改User-Agent

本文探讨了浮点型除法的精确计算方法,利用BigDecimal类实现无误差运算,介绍了轧差技巧处理除不尽问题。同时,解决了Toast显示异常、图片intent打开、华为设备HTTP请求错误及Retrofit自定义User-Agent等常见编程难题。

1.浮点型除法精确计算

来自https://blog.csdn.net/h4x0r_007/article/details/45171141

1. BigDecimal初始化小数时,尽量用字符串形式,例如new BigDecimal("0.1");
2. BigDecimal类型变量比较大小时用compareTo方法,判断变量值是否为0,与BigDecimal.ZERO比较大小。
3. BigDecimal作除法时,除了要考虑除数是否为0,更要考虑是否能除尽的问题,直接调用BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)方法做除法可以避免除不尽的问题。

2.轧差

	一种除不尽的解决方法。如1除以3,得0.3333........,是一个循环小数。不能直接存储这种数,否则会造成精度丢失(浮点型)。
        int n = 3;//除数
        BigDecimal bigDecimal = new BigDecimal("1");
        BigDecimal a = bigDecimal.divide(new BigDecimal(n + ""), 1, BigDecimal.ROUND_HALF_UP);
        BigDecimal has = a.multiply(new BigDecimal((n - 1) + ""));
        BigDecimal b = bigDecimal.subtract(has);
        Log.d("test123", a + "," + b);
2019-04-16 23:44:16.417 8191-8191/cn.xd.study D/test123: 0.3,0.4

1、2:0.3 ,3:0.4
前面的n-1笔四舍五入,最后一笔为剩余的数值。

3.Toast显示不正常,如:上下边距不同。

解决办法:传入整个应用的context。
自定义一个Application。

public class AppContext extends Application {

    private static AppContext appContext;
    @Override
    public void onCreate() {
        super.onCreate();
        appContext = this;
    }

    public static AppContext getAppContext() {
        return appContext;
    }
}

在AndroidManifest中启用。

    <application
    	..........
        android:name=".AppContext"
        android:theme="@style/AppTheme">

使用

Toast.makeText(AppContext.getAppContext(), "信息", Toast.LENGTH_SHORT).show();

4.打开图片的intent

注意授权

Intent intent = new Intent(Intent.ACTION_VIEW); intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 //授权
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri uri = FileProvider.getUriForFile(context, "com.chen.ezifn.FileProvider", file);
intent.setDataAndType(uri, "image/*");
startActivity(intent);

5.华为v20 http请求报错not permitted by network security policy

原因:限制了明文流量的网络请求。

默认情况下启用网络传输层安全协议 (TLS)
如果您的应用以 Android 9 或更高版本为目标平台,则默认情况下 isCleartextTrafficPermitted() 函数返回 false。 如果您的应用需要为特定域名启用明文,您必须在应用的网络安全性配置中针对这些域名将 cleartextTrafficPermitted 显式设置为 true

解决方法:
1.在res文件中创建xml目录,并在此文件中创建network_config.xml 文件。

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
2.在AndroidManifest中使用。
 <application
		................
        android:networkSecurityConfig="@xml/network_config"
		>
 </application>

6.Retrofit修改User-Agent

OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {

                Request request = chain.request()
                        .newBuilder()
                        .removeHeader("User-Agent")//移除旧的
                        .addHeader("User-Agent", “do.........”)//添加真正的头部
                        .build();
                return chain.proceed(request);
            }
        }).build();

        retrofit = new Retrofit.Builder()
                .client(client)
                .baseUrl(Address.DEVELOPMENT_HOST_ADDRESS)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值