Jaqen's Blog

Jaqen's Blog

使用三种不同的方式绘制图片
在 Android 平台上绘制一张图片,使用三种不同的 API,ImageView、SurfaceView、自定义 View。 ImageView 绘制图片这种方式较为普遍简单。 123ImageView imageView = findViewById(R.id.image_view); Bitmap bitmap = BitmapFactory.decodeFile(new File(FileUtil.getExternalAssetsDir(this), "jaqen.png").getPath()); imageView.setImageBitmap(bi...
Kotlin Koans 学习笔记
Kotlin Koans 是 Kotlin 官方推出的一系列 Kotlin 语法练习。 一共分为 6 个模块,每个模块若干任务,每个任务都有一系列单元测试,目标就是编码通过单元测试。 本文是在学习 Kotlin Koans 过程中将相关语法点做一个简单的记录。 IntroductionHello_World和大多数语言一样,第一个任务的名称就是 Hello World。这个任务很简单,就是要求 task0 函数返回一个字符串ok。 123fun task0(): String { return "OK"} Kotlin 中函数使用关键字fun声明,返回类型在...
Android 图片预览库封装
基于 PhotoView,增加手势旋转、拖动退出预览功能。 GitHub:PhotoViewEx 依赖在项目 build.gradle 中添加依赖 12345allprojects { repositories { maven { url "https://jitpack.io" } }} module 的 build.gradle 中添加依赖 123dependencies { implementation 'com.github.zywudev:PhotoViewEx:1.0.0' ...
OkHttp 源码分析(三):连接机制
前面两篇文章分别介绍了 OkHttp 的请求流程和缓存机制,最后这篇文章介绍 OkHttp 的连接机制,作为 OkHttp 源码分析的收尾。 建议将 OkHttp 的源码下载下来,使用 IDEA 编辑器可以直接打开阅读。我这边也将最新版的源码下载下来,进行了注释说明,有需要的可以直接从 这里 下载查看。 创建连接OkHttp 连接的创建是通过 StreamAllocation 对象统筹完成。 它主要用来管理两个角色: RealConnection:真正建立连接的对象,利用 Socket 建立连接。 ConnectionPool:连接池,用来管理和复用连接。 StreamAlloca...
OkHttp 源码分析(二):缓存机制
上一篇文章我们主要介绍了 OkHttp 的请求流程,这篇文章讲解一下 OkHttp 的缓存机制。 建议将 OkHttp 的源码下载下来,使用 IDEA 编辑器可以直接打开阅读。我这边也将最新版的源码下载下来,进行了注释说明,有需要的可以直接从 这里 下载查看。 在网络请求的过程中,一般都会使用到缓存,缓存的意义在于,对于客户端来说,使用缓存数据能够缩短页面展示数据的时间,优化用户体验,同时降低请求网络数据的频率,避免流量浪费。对于服务端来说,使用缓存能够分解一部分服务端的压力。 在讲解 OkHttp 的缓存机制之前,先了解下 Http 的缓存理论知识,这是实现 OkHttp 缓存的基...
OkHttp 源码分析(一):请求流程
这篇文章主要梳理一下 OkHttp 的请求流程,对 OkHttp 的实现原理有个整体的把握,再深入细节的实现会更加容易。 建议将 OkHttp 的源码下载下来,使用 IDEA 编辑器可以直接打开阅读。我这边也将最新版的源码下载下来,进行了注释说明,有需要的可以直接从 这里 下载查看。 基本使用我们先看一下 OkHttp 的基本使用。 12345678910111213141516171819202122232425262728293031// 1、创建 RequestRequest request = new Request.Builder() .get() .url("x...
科学上网 Vultr 搭建 SS 方法
前几天,搬瓦工服务器到期了。准备再买的,但是最近搬瓦工被封的比较频繁,加上价格越来越高,想换一家试试,所以就找到了 vultr。 这里备忘一些 ss 连接服务器的命令。注册账户、购买、部署服务器步骤省略。 点击 官网地址 。 window 下需安装 git。 git 命令行输入: 1ssh root@45.76.111.96 接着输入密码(服务器密码,图中红框)。 12345wget –no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsock...
Java 内部类总结
Java 中,可以将一个类定义在另一个类或者一个方法里面,这样的类称为内部类。 一般包含四种内部类:成员内部类、匿名内部类、局部内部类和静态内部类。 成员内部类成员内部类的定义位于另一个类的内部,形式如下: 1234567891011121314151617181920public class Outer { private String name; class Inner { Inner(){ name = "wuzy"; } private void displayNa...
Java 类加载器
类的生命周期包含七个阶段: 加载、验证、准备、解析、初始化、使用、卸载。 验证、准备、解析三个阶段统称为连接。 加载、验证、准备、初始化和卸载的顺序是确定的,解析和初始化的前后顺序不一定,主要是为了实现动态绑定。 类加载过程类加载过程主要包含加载、验证、准备、解析和初始化这 5 个阶段。 加载加载是类加载的第一个阶段,注意不要混淆。 加载过程要完成的三件事情: 通过一个类的全限定名来获取定义此类的二进制字节流。 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口...
理解 ThreadLocal
ThreadLocal 是什么ThreadLocal 提供了线程局部变量。它和普通变量的区别在于,普通变量可以被任何一个线程访问并修改,而使用 ThreadLocal 创建的变量只能被当前线程访问,也就是线程私有,其他线程无法访问和修改。 ThreadLocal 用法创建: 1ThreadLocal<Boolean> threadLocal = new ThreadLocal<>(); set 方法: 1threadLocal.set(false); get 方法: 1threadLocal.get() 我们来看一个完整的示例: 12345678910111213...
avatar
Jaqen Ng