日期: 2021 年 9 月 26 日

vscode 怎么设置代理,让测试的 axios 也能够自动使用该代理?

我们使用了一个第三方的库,这个库是用 axios 访问 dropbox 的 API, 比如 https://api.dropboxapi.com/oauth2/token, 但是 dropbox 被墙了,大家都知道。

现在我在操作系统 windows 10 network setting 里面,设置了代理。然后在 vscode 的 config 里面,也设置了 “http.proxy”: “http://xxx.com:8080” 和 “http.proxyStrictSSL”: false

但是,调用该库的时候,还是返回 not authenticated.的。

我用浏览器网页试过了,通过该代理是能够访问 dropbox 的。

谢谢!

p.s. axios 好像是可以直接设置代理的,但我们调用的是第三方的库,这个库里面使用的 axios,我没有办法直接改代码。

axios 代理 VSCode Dropbox12 条回复 • 2021-09-26 13:41:06 +08:00
cz5424 1
cz5424 3 小时 48 分钟前
检查一下代理访问是否需要账号密码
yazoox 2
yazoox 3 小时 40 分钟前
@cz5424 忘记说了,不需要密码。代理是公司内部的结点,用的 squid3 搭的,直接 http://xxx.com:8080 就可以了。浏览器就是用的 switchy omega 这么设置的,正常工作。
renmu123 3
renmu123 3 小时 34 分钟前 via Android
不如魔改一下让三方库支持代理
dcsuibian 4
dcsuibian 3 小时 27 分钟前 ❤️ 1
有点不太明白这个程序是怎么运行的,如果是通过 node 运行的话,不应该让命令行走代理吗?为什么要让 vscode 走代理?
lin07hui 5
lin07hui 3 小时 13 分钟前
vscode 插件开发 or 前端开发 ?
ispengsiqi 6
ispengsiqi 3 小时 6 分钟前
@renmu123 #3 感觉做一个旁路由透明代理可能会还更方便一点
ai277014717 7
ai277014717 2 小时 57 分钟前
使用 terminal 打开 vscode,打开之前设置 http_proxy https_proxy all_porxy 应该可以。
AreYou0k 8
AreYou0k 2 小时 53 分钟前
自己写一个走代理连 dropbox 的 API 的接口, 然后用这个第三方库连自己写的接口. (方案有点捞)
cweijan 9
cweijan 2 小时 40 分钟前
vscode 的代理是设置的内部的服务请求, 没法到影响 axios, 我能想到的方法是用 proxifier 设置系统代理, 这个软件可以匹配指定域名.
EridanusSora 10
EridanusSora 2 小时 23 分钟前
proxifier 代理 node
archean 11
archean 16 分钟前
netsh winhttp set proxy proxy-server=”http://xxx.com:8080″ bypass-list=”*.internaldomain.com”
archean 12
archean 13 分钟前
@archean 没写完发出去了,这个命令可以让很多命令行程序访问 http/https 协议的时候走代理,可以试试能否满足你的要求。

如何在Linux中获取Ram信息?

我们有很多服务器。 有不同类型的供应商和产品。 跟踪他们的硬件是艰苦的工作。 例如,不可能通过打开所有服务器箱来获取ram信息。 Linux魔术来了。 Linux提供了许多命令。 我们可以像下面那样使用dmidecode 。

使用dmidecode获取信息 (Getting Information With dmidecode)

dmidecode is very useful command which can provide information about hardware of the system. dmidecode will list a lot of information about CPU, Memory, Mainboard, Devices, Network etc. by default without providing any option. We will use --type 17 option in order to print detailed Memory or RAM information like below.

dmidecode是非常有用的命令,可以提供有关系统硬件的信息。 默认情况下, dmidecode将列出许多有关CPU,内存,主板,设备,网络等的信息,而无需提供任何选项。 我们将使用--type 17选项来打印详细的内存或RAM信息,如下所示。

$ dmidecode --type 17
Getting Information With dmidecode
Getting Information With dmidecode
使用dmidecode获取信息

We can see that the system has 2048 MB RAM and multiple RAM slots.

我们可以看到系统具有2048 MB RAM和多个RAM插槽。

获取内存大小 (Getting Memory Size)

As we have seen that dmidecode will print a lot of information about the RAM but if we want to strictly filter the RAM size we can use grep command like below by providing Size term.

正如我们已经看到的那样, dmidecode将打印很多有关RAM的信息,但是如果我们要严格过滤RAM大小,可以通过提供Size term来使用grep命令,如下所示。

$ sudo dmidecode --type 17 | grep Size
Getting Memory Size
Getting Memory Size
获取内存大小

获取内存频率(Getting Memory Frequency)

Like RAM size we can also print the frequency of the RAM with grep command. As frequency is expressed with MHz we will provide  Speed to the grep command.

像RAM大小一样,我们也可以使用grep命令打印RAM的频率。 当频率以MHz表示时,我们将为grep命令提供Speed 。

$ sudo dmidecode --type 17 | grep MHz

打印RAM /内存尺寸 (Print RAM/Memory Form Factor)

Memory/RAM has physically different form factors. Currently DIMM or SODIMM is very popular. We can get this information with the following command.

内存/ RAM在物理上有不同的外形尺寸。 当前,DIMM或SODIMM非常流行。 我们可以使用以下命令获取此信息。

$ sudo dmidecode --type 17 | grep Factor
Print RAM/Memory Form Factor
Print RAM/Memory Form Factor
打印RAM /内存尺寸

如何在Linux中获取Ram信息? 信息移植 (How To Get Ram Information In Linux? Infografic)

   How To Get Ram Information In Linux? Infografic
How To Get Ram Information In Linux? Infografic

如何在Linux中列出磁盘的所有分区?

操作系统使用存储或磁盘来持久保存数据。 磁盘与分区一起使用可轻松管理它们。 通常,操作系统和数据分区是分开放置的。 Linux的主目录是分开的,因为主目录中的问题(例如填满)不会影响整个系统。 现代Linux系统使用很多分区。 这是一个问题:如何列出Linux系统中存在的分区。

使用fdisk列出分区 (List Partitions With fdisk)

fdisk is number one tool used by system administrators to manage disk. fdisk provides creating, deleting, listing of partitions. We need to use  sudo in order to get root privileges.

fdisk是系统管理员用来管理磁盘的*工具。 fdisk提供创建,删除,列出分区的信息。 我们需要使用sudo以获得root特权。

$ sudo fdisk -l
List Partitions With fdisk
List Partitions With fdisk
使用fdisk列出分区
  • There is a lot of information from system administrator perspective.

    从系统管理员的角度来看,有很多信息。

  • /dec/vda is disk to list partitions

    / dec / vda是列出分区的磁盘

  • /dev/vda1 is the partition of the disk

    / dev / vda1是磁盘的分区

列出具有/ proc / partitions的分区(List Partitions with /proc/partitions)

We can get more simpler list by using kernel provided information like below

我们可以通过使用内核提供的信息来获得更简单的列表,如下所示

$ cat /proc/partitions
List Partitions with /proc/partitions
List Partitions with /proc/partitions
列出具有/ proc / partitions的分区
  • /proc/partitions provides information about partitions in a simple manner

    / proc / partitions以简单的方式提供有关分区的信息

  • vda1 is a partition

    vda1是一个分区

列出分区的分区(List Partitions with parted)

Parted is popular application especially creating, deleting partitions and file systems. We can use parted to list partitions too. We will also  use -l option in order to list partitions.

Parted是流行的应用程序,尤其是创建,删除分区和文件系统。 我们也可以使用parted列出分区。 我们还将使用-l选项来列出分区。

$ parted -l
List Partitions with parted
List Partitions with parted
列出分区的分区

Disk information like Model, Sector Size and Partition Table type is also provided.

还提供了磁盘信息,例如型号,扇区大小和分区表类型。

列出具有blkid的分区 (List Partitions with blkid)

blkid is a command which will list block information with the related ID or UUID. This will also print partitions too. We need to provide sudo command too.

blkid是将列出具有相关ID或UUID的块信息的命令。 这也将打印分区。 我们也需要提供sudo命令。

$ blkid
List Partitions with blkid
List Partitions with blkid
列出具有blkid的分区

列出具有lsblk的分区(List Partitions with lsblk)

lsblk is generally used to get mount points of the partitions but also used to list partitions. This command will list partitions and disk in a tree form.

lsblk通常用于获取分区的安装点,但也用于列出分区。 该命令将以树形形式列出分区和磁盘。

$lsblk
List Partitions with lsblk
List Partitions with lsblk
列出具有lsblk的分区

As we can see that fedora-root and fedora-swap are partitions created in the sda. There is also information like partition and disk size, type and mount point.

如我们所见, fedora-rootfedora-swap是在sda创建的分区。 还有诸如分区和磁盘大小,类型和安装点之类的信息。

LEARN MORE  Overview Of Linux File Systems Like Ext3, Btrfs, Zfs
了解更多Linux文件系统概述,例如Ext3,Btrfs,Zfs

如何在Linux中列出磁盘的所有分区? 信息移植 (How To List All Partitions Of A Disk In Linux? Infografic)

How To List All Partitions Of A Disk In Linux? Infografic
How To List All Partitions Of A Disk In Linux? Infografic

如何查看Linux的内存使用情况?

Linux操作系统因其高效的内存使用而广受欢迎。 Linux操作系统还提供了许多有关其内存使用情况的详细信息。 在本教程中,我们将研究内存使用信息的详细信息。 有多种获取内存使用情况信息的方法。 另外,我们可以称这种RAM使用率。 因为在静态中,大多数信息都是关于RAM的

免费获取信息(Get Information With free)

free is very easy and lane command to get basic information about Linux operating system memory usage. Here is Linux free memory.

free非常简单,用lane命令获取有关Linux操作系统内存使用情况的基本信息。 这是Linux可用内存。

$ free
Get Information With free
Get Information With free
免费获取信息
  • We have 1 GB ram and 441 MB of this ram is currently used.

    我们有1 GB内存,目前使用了441 MB。

  • There is no swap memory

    没有交换内存

可读格式(Human Readable Format)

We can show memory usage with free more human readable by changing KB to GB like below. -h parameters makes this magic.

通过将KB更改为GB(如下所示),我们可以显示出更多免费使用的内存用法。 -h参数使此神奇。

$ free -h
Human Readable Format
Human Readable Format
可读格式

以兆字节格式显示(Display In Megabyte Format)

By default free command print information about the memory in byte format. It can be hard to read in general. We can print this information in megabyte or MB format with the --mega option.

默认情况下, free命令以byte格式打印有关内存的信息。 通常很难阅读。 我们可以使用--mega选项以兆字节或MB格式打印此信息。

$ free --mega
Display In Megabyte Format
Display In Megabyte Format
以兆字节格式显示

以千兆字节格式显示(Display In Gigabyte Format)

By default free command print information about the memory in byte format. It can be hard to read in general. We can print this information in gigabyte or GB format with the --giga option.

默认情况下, free命令以byte格式打印有关内存的信息。 通常很难阅读。 我们可以使用--giga选项以GB或GB格式打印此信息。

$ free --giga
Display In Gigabyte Format
Display In Gigabyte Format
以千兆字节格式显示

通过顶部获取信息(Getting Information With top)

top command is very detailed and interactive tool to get memory usage information.

top命令是非常详细的交互式工具,用于获取内存使用信息。

Getting Information With top
Getting Information With top
通过顶部获取信息

top is a real time tool so it will update table by default in 2 seconds. To list  processes with top according to memory usage use 

top是一个实时工具,因此默认情况下它将在2秒内更新表格。 要根据内存使用情况列出*上面的进程,请使用M

LEARN MORE  How To Use Linux dmesg Command To Print System Logs?
了解更多信息如何使用Linux dmesg命令打印系统日志?
Getting Information With top
Getting Information With top
通过顶部获取信息

gnome-shell is number one process in memory consumption with %15.3 and other processes listed descending.

gnome-shell是内存消耗中排名*的进程,%15.3和其他列出的进程降序排列。

We can see at the top KiB Mem: line there is existing memory size and current general usage.

我们可以在顶部KiB Mem:行中看到现有的内存大小和当前的常规用法。

free command
free command
自由命令

如何查看Linux的内存使用情况? 信息移植 (How To Check Memory Usage Of Linux? Infografic)

How To Check Memory Usage Of Linux? Infografic

如何获得Linux内核版本?

Linux kernel is the core of the Linux based operating systems we call them simply Linux. But sometimes they called Linux Distributions. Kernel initialize system with hardware. Manages hardware to provide services for upper layer operating system application. Kernel do memory management which means allot memory for applications or frees the memory. Manages processes by creating, forking or killing them. Now some little Linux kernel history.

Linux内核是基于Linux的操作系统的核心,我们称之为Linux。 但是有时他们称Linux发行版。 内核使用硬件初始化系统。 管理硬件以为上层操作系统应用程序提供服务。 内核执行内存管理,这意味着为应用程序分配内存或释放内存。 通过创建,派生或杀死进程来管理进程。 现在了解一些Linux内核历史记录。

发行历史 (Release History)

  • 1.0 kernel released 1994

    1994年发布的1.0内核

  • 2.0 kernel released 1996

    2.0内核发布于1996年

  • 3.0 kernel released 2011

    3.0内核发布于2011年

  • 4.0 kernel released 2015

    2015年发布的4.0内核

Generally version exist major,minor numbers.

一般版本存在大,小编号。

Linux Kernel Version Map
Linux Kernel Version Map
Linux内核版本图

如何使用uname获得内核版本(How To Get Kernel Version With uname)

We can get kernel related information with uname . One of information uname provides is kernel version.

我们可以使用uname获得与内核相关的信息。 匿名提供的信息之一是内核版本。

$uname -a
How To Get Kernel Version With uname
How To Get Kernel Version With uname
如何使用uname获得内核版本
  • We provide -a to the uname  to get all information

    我们提供-auname以获取所有信息

  1. $uname -r
  2. 3.10.0-327.36.3.el7.x86_64
  • -r parameter will provide kernel version

    -r参数将提供内核版本

  • is the major version number

    3是主要版本号

  • 10 is minor version number

    10是次要版本号

  • other part is build number

    另一部分是内部编号

  • x86_64 is architecture of the kernel which is x86 64 bit

    x86_64是x86 64位内核的体系结构

从/ proc / version文件打印内核版本(Print Kernel Version From /proc/version File)

/proc directory provides different information about the Linux system. Linux kernel version is also provided from /proc/version file. We will use cat command in order to print Linux kernel version.

/proc目录提供有关Linux系统的不同信息。 Linux内核版本也从/proc/version文件提供。 我们将使用cat命令来打印Linux内核版本。

Print Kernel Version From /proc/version File
Print Kernel Version From /proc/version File
从/ proc / version文件打印内核版本

从dmesg获取内核版本(Get Kernel Version From dmesg)

dmesg is a tool used to print kernel level logs. Especially from system startup different type of logs are provided. During to the the kernel is loaded and the version information also provided to the dmesg log. We can use dmesg to print Linux kernel version information.

dmesg是用于打印内核级日志的工具。 特别是在系统启动时,提供了不同类型的日志。 在内核加载期间,还将版本信息提供给dmesg日志。 我们可以使用dmesg打印Linux内核版本信息。

$ dmesg | grep version
Get Kernel Version From dmesg
Get Kernel Version From dmesg
从dmesg获取内核版本
LEARN MORE  Linux VMware Workstation Not Enough Physical Memory Is Available Error and Solution
了解更多信息Linux VMware Workstation的可用物理内存不足错误和解决方案

如何获得Linux内核版本? 信息移植 (How To Get Linux Kernel Version? Infografic)

How To Get Linux Kernel Version? Infografic

android clipRect Op.xxx各个参数理解

有点小啰嗦的一篇学习笔记,可以直接看*后得出的结论:前面的各种图片和说明都是为*后的结论服务的

1)剪切:和平常画图工具剪切的作用一样,在画布上剪切一个区域,比如剪切一个Rect区域,画布canvas其余的部分都丢掉,之后所有的画图都在这个Rect区域内进行(如果不涉及save和restore方法)。

2)clip进行剪切的时候,不会影响之前已经画好的图形。

3)剪切是对canvas的操作,而不是在canvas上的图进行操作。

为了说明这几点,下面进行一下说明。

步骤1) 在剪切之前绘制一个全屏的蓝色的矩形。

2)定义剪切的矩形Rect区域,并进行剪切

3)设置剪切过后画布颜色为红色

运行的效果如下图所示:此时剪切过后画布的区域就是剪切的Rect区域,虽然剪切掉了canvas上面和下面的一部分,但是仍然会把途中所示的蓝色部分显示出来而不会剪切掉:也就是如上所说不会影响之前已经画好的图形。

%title插图%num

 

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
protected void onDraw(Canvas canvas) {
        int width = getMeasuredWidth();
        int height = getMeasuredHeight();
        
        
        Paint paint = new Paint();
        paint.setColor(Color.BLUE);    
        //全屏绘制一个蓝色的矩形画面
        canvas.drawRect(0, 0,width,height,paint);
    
        //定义剪切的Rect区域
        Rect rect = new Rect();
        rect.left = 0;
        rect.top = 300;//左上角(0,300)
        rect.right = width;
        rect.bottom = height/2; //右下角(width,height)
        //进行剪切   
        canvas.clipRect(rect)
        canvas.drawColor(Color.RED);
     
    }

上面的clipRect是只有一个参数的(默认为INTERSECT,下面看看它的重载方法Cliprect(rect,OP.xx)第二个参数以及各个参数的含义和运行效果:

开始之前做些准备工作:

区域A:剪切之前的画布区域

区域B:当前要剪切的区域,也就是clipRect的*个参数所表示的区域

在没有直接写代码测试之前对这些字段的翻译和查阅写数学资料并对Op.xxx的各种字段在心里做了如下假设:

XOR:异或运算,相同为0(false),不用为1(true),也就是两个区域重叠的地方为0,不同的地方为1,剪切过后的画布的区域就是两个区域不重叠的部分。

INTERSECT:交集运算,剪切过后的画布区域就是两个区域的交集区域。

REPLACE:这个有待验证,不明所以,从字面意思来说是代替的意思,应该就是用B的区域代替A的区域,所以剪切过后的画布区域可能就是只剩下B的区域,当然这个只是假设,有待下面的验证过。

DIFFERENCE:差集运算,剪切过后的画布的区域就是A-B

REVERSE_DIFFERENCE:差集运算,REVERSE为反向,逆向的意思,不难猜出剪切过后的画布区域是B-A的区域

UNION:并集运算,剪切过后的画布区域就是A和B的区域相加,当然重叠的地方只计算一次

下面就写程序注意验证上面的结果和得出相应的结论

先是全集和子集的情况:此时A为全集区域,B为A的子集

%title插图%num

a) Op.DIFFERENCE:即将剪切的区域(设置B)与当前canvas(设置A)之间的差集,剪切过后还剩下的画布canvas区域就是A-B的区域,看看运行结果

步骤还是之前的步骤,只是把canvas.clipRect(rect)改成canvas.clipRect(rect,Op.DIFFERENCE);运行结果如下:<喎�”/kf/ware/vc/” target=”_blank” class=”keylink”>vcD4KPHA+PGltZyBzcmM9″/uploadfile/Collfiles/20150212/2015021208423342.png” alt=”\”>

b) Op.REVERSE_DIFFERENCE:对比DIFFERENCE取A-B,REVERSE是相反的意思,所以为B-A,因为B为A的子集,所以该差集不存在,所以运行结果为下:

%title插图%num

c) Op.XOR:两个区域进行异或运算,异或运算的规则是:“相同为0(false),不同为1(true)”,当两个区域进行异或的时候,很显然“区域重叠的地方为0,不重叠的地方为1”,剪切过后剩下的画布canvas的区域就是不重叠的地方所在的区域,看看运行结果

%title插图%num

d) Op.UNION 取A和B的并集,所以运行结果为下图:

%title插图%num

 

e) Op.INTERSECT 取A和B的交集,因为上面的程序中A是全屏的画布范围,而B在A里面,所以剪切的结果为下图所示,所以说交集为B的范围

%title插图%num

f) Op.REPLACE,运行效果如下

%title插图%num

通过全集和子集的运行效果来看,REPLACE应该就是跟上面设想的一样,其余的倒是跟设想的结论一样。

所以我就测试了非全集和子集的情况

此时A区域和B区域的关系如图,C为A和B的交集区域:

%title插图%num

测试画图步骤:

1)绘制一个蓝色的矩形面

2)定义A的Rect对象(*次要剪切的区域),并开始剪切

3)定义B的rect对象并开始剪切,并且调用clipRect(rect,Op.xxx)来看不用xxx下剪切的效果

4)把剪切过后的画布设置为红色

上面步骤的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
                int width = 1000;
                int height =1000;
                Paint paint = new Paint();
        paint.setColor(Color.BLUE);    
        //全屏绘制一个蓝色的矩形画面
        canvas.drawRect(0, 0,width,height,paint);
        
              //定义区域A的rect对象
        Rect rect = new Rect();
        rect.left =100;
        rect.top = 100;//左上角(0,300)
        rect.right = 300;
        rect.bottom = 300; //右下角(width,hei
        //剪切为A区域
        canvas.clipRect(rect);//同clipRect
        
                //设置b的rect对象
        rect.left =200;
        rect.top = 200;//左上角(0,300)
        rect.right = 400;
        rect.bottom = 400; //右下角(width,height) 
        canvas.clipRect(rect,Op.xxxx);
                //把剪切过后的画布设置红色
                canvas.drawColor(Color.RED);

 

a) DIFFERENCE的情况下的运行效果(A-B的差集):也就是A区域去掉C区域

%title插图%num

b) REVERSE_DIFFERENCE的运行效果如下图(B-A的差集):也就是B区域去掉C区域

%title插图%num

c) UNION 的运行结果 (A和B的并集)

%title插图%num

d) INTERSECT (交集运算)此时画布只剩下C区域可以显示,所以运行结果如下

%title插图%num

e)XOR 异或运算,剪切过后的结果为A和B区域不重叠的区域

%title插图%num

f)REPLACE 这个运算结果是什么呢?就是B区域,也就是剪切过后的结果只保留B区域,这也就是REPLACE代替或者替换的含义:当前还没被剪切的区域A被即将要剪切的区域B来代替。

%title插图%num

结论:

XOR:异或运算,相同为0(false),不用为1(true),也就是两个区域重叠的地方为0,不同的地方为1,剪切过后的画布的区域就是两个区域不重叠的部分。

INTERSECT:交集运算,剪切过后的画布区域就是两个区域的交集区域。

DIFFERENCE:差集运算,剪切过后的画布的区域就是A-B

REVERSE_DIFFERENCE:差集运算,REVERSE为反向,逆向的意思,不难猜出剪切过后的画布区域是B-A的区域

UNION:并集运算,剪切过后的画布的区域为A+B的区域

REPLACE:也就是剪切过后的结果只保留B区域,这也就是REPLACE代替或者替换的含义:当前还没被剪切的区域A被即将要剪切的区域B来代替。

clipRect 介绍

clipRect 介绍

android的clip有以下两点疑问:

Clip(剪切)的时机

Clip中的Op的参数的意思。

 

通常咱们理解的clip(剪切),是对已经存在的图形进行clip的。但是,在android上是对canvas(画布)上进行clip的,要在画图之前对canvas进行clip,如果画图之后再对canvas进行clip不会影响到已经画好的图形。一定要记住clip是针对canvas而非图形。

 

接下来通过android自带的APIdemo Clipping例子详细讲述Clip中的Op的参数的意思。Android提供clipRect、clipPath和clipRegion剪切区域的API。

Op一共有 DIFFERENCE,INTERSECT,UNION,XOR, REVERSE_DIFFERENCE, REPLACE六种选择。

 

例子:

在canvas上剪切从(0,0)到(60,60)的方块。下图蓝色区域加紫色区域。

在canvas上剪切从(40,40)到(100,100)的方块。下图橄榄色区域加紫色区域。

在canvas上剪切从(0,0)到(100,100)的方块。


先在第二方块上加上Op参数例如:canvas.clipRect(40, 40, 100, 100, Region.Op. DIFFERENCE);

首先,需要搞清楚Op参数针对的对象。接着了解其含义。

Op参数针对的对象是之前剪切的区域以及当前要剪切的区域。

在本例中涉及到区域是从(0,0)到(60,60)的方块和从(40,40)到(100,100)的方块。

那有哪些含义呢?就是表示当前要剪切的区域与之前剪切过的之间的关系。

 

DIFFERENCE:之前剪切过除去当前要剪切的区域(蓝色区域)。

INTERSECT:当前要剪切的区域在之前剪切过内部的部分(紫色区域)。

UNION:当前要剪切的区域加上之前剪切过内部的部分(蓝色区域+紫色区域+橄榄色区域)。

XOR:异或,当前要剪切的区域与之前剪切过的进行异或。(蓝色区域+橄榄色区域)。

REVERSE_DIFFERENCE:与DIFFERENCE相反,以当前要剪切的区域为参照物,当前要剪切的区域除去之前剪切过的区域(橄榄色区域);

REPLACE:用当前要剪切的区域代替之前剪切过的区域。(橄榄色区域+紫色区域);

没带Op参数效果与INTERSECT的效果一样,两个区域的交集。

Android中 Bitmap和Drawable相互转换的方法

Android中 Bitmap和Drawable相互转换的方法

1、Drawable –> Bitmap

  1.     Bitmap drawable2Bitmap(Drawable drawable) {
  2.         if (drawable instanceof BitmapDrawable) {  
  3.             return ((BitmapDrawable) drawable).getBitmap();  
  4.         } else if (drawable instanceof NinePatchDrawable) {  
  5.             Bitmap bitmap = Bitmap
  6.                     .createBitmap(
  7.                             drawable.getIntrinsicWidth(),
  8.                             drawable.getIntrinsicHeight(),
  9.                             drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
  10.                                     : Bitmap.Config.RGB_565);
  11.             Canvas canvas = new Canvas(bitmap);  
  12.             drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),  
  13.                     drawable.getIntrinsicHeight());
  14.             drawable.draw(canvas);
  15.             return bitmap;  
  16.         } else {  
  17.             return null;  
  18.         }
  19.     }

2、从资源中获取的Drawable –> Bitmap

  1.     Resources res = getResources();
  2.     Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.pic);

 

3、Bitmap –> Drawable

  1.     Drawable bitmap2Drawable(Bitmap bitmap) {
  2.         return new BitmapDrawable(bitmap);  
  3.     }

 

4、Bitmap –> byte[]

  1.     byte[] Bitmap2Bytes(Bitmap bm) {  
  2.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  3.         bm.compress(Bitmap.CompressFormat.PNG, 100, baos);  
  4.         return baos.toByteArray();  
  5.     }

 

5、 byte[] –> Bitmap

    1.     Bitmap Bytes2Bimap(byte[] b) {  
    2.         if (b.length != 0) {  
    3.             return BitmapFactory.decodeByteArray(b, 0, b.length);  
    4.         } else {  
    5.             return null;  
    6.         }
    7.     }

Drawable 添加过滤色,改变图片颜色

Drawable 添加过滤色,改变图片颜色

复制代码
 /**
   * 更改图片颜色
   * @param drawable
   * @param color
   * @return
   */
  public Drawable getDrawable(Drawable drawable,int color){
    drawable.setColorFilter(color, PorterDuff.Mode.MULTIPLY);
    return drawable;
  }
复制代码

 

Android内存优化4 了解java GC 垃圾回收机制2 GC执行finalize的过程

Android内存优化4 了解java GC 垃圾回收机制2 GC执行finalize的过程

1. finalize的作用

 

  • finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。
  • finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性
  • 不建议用finalize方法完成“非内存资源”的清理工作,但建议用于:① 清理本地对象(通过JNI创建的对象);② 作为确保某些非内存资源(如Socket、文件等)释放的一个补充:在finalize方法中显式调用其他资源释放方法。其原因可见下文[finalize的问题]

2. finalize的问题

  • 一些与finalize相关的方法,由于一些致命的缺陷,已经被废弃了,如System.runFinalizersOnExit()方法、Runtime.runFinalizersOnExit()方法
  • System.gc()与System.runFinalization()方法增加了finalize方法执行的机会,但不可盲目依赖它们
  • Java语言规范并不保证finalize方法会被及时地执行、而且根本不会保证它们会被执行
  • finalize方法可能会带来性能问题。因为JVM通常在单独的低优先级线程中完成finalize的执行
  • 对象再生问题:finalize方法中,可将待回收对象赋值给GC Roots可达的对象引用,从而达到对象再生的目的
  • finalize方法至多由GC执行一次(用户当然可以手动调用对象的finalize方法,但并不影响GC对finalize的行为)

3. finalize的执行过程(生命周期)

 

(1) 首先,大致描述一下finalize流程:当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。
(2) 具体的finalize流程:
对象可由两种状态,涉及到两类状态空间,一是终结状态空间 F = {unfinalized, finalizable, finalized};二是可达状态空间 R = {reachable, finalizer-reachable, unreachable}。各状态含义如下:
  • unfinalized: 新建对象会先进入此状态,GC并未准备执行其finalize方法,因为该对象是可达的
  • finalizable: 表示GC可对该对象执行finalize方法,GC已检测到该对象不可达。正如前面所述,GC通过F-Queue队列和一专用线程完成finalize的执行
  • finalized: 表示GC已经对该对象执行过finalize方法
  • reachable: 表示GC Roots引用可达
  • finalizer-reachable(f-reachable):表示不是reachable,但可通过某个finalizable对象可达
  • unreachable:对象不可通过上面两种途径可达
状态变迁图:
%title插图%num
变迁说明:
  1. 新建对象首先处于[reachable, unfinalized]状态(A)
  2. 随着程序的运行,一些引用关系会消失,导致状态变迁,从reachable状态变迁到f-reachable(B, C, D)或unreachable(E, F)状态
  3. 若JVM检测到处于unfinalized状态的对象变成f-reachable或unreachable,JVM会将其标记为finalizable状态(G,H)。若对象原处于[unreachable, unfinalized]状态,则同时将其标记为f-reachable(H)。
  4. 在某个时刻,JVM取出某个finalizable对象,将其标记为finalized并在某个线程中执行其finalize方法。由于是在活动线程中引用了该对象,该对象将变迁到(reachable, finalized)状态(K或J)。该动作将影响某些其他对象从f-reachable状态重新回到reachable状态(L, M, N)
  5. 处于finalizable状态的对象不能同时是unreahable的,由第4点可知,将对象finalizable对象标记为finalized时会由某个线程执行该对象的finalize方法,致使其变成reachable。这也是图中只有八个状态点的原因
  6. 程序员手动调用finalize方法并不会影响到上述内部标记的变化,因此JVM只会至多调用finalize一次,即使该对象“复活”也是如此。程序员手动调用多少次不影响JVM的行为
  7. 若JVM检测到finalized状态的对象变成unreachable,回收其内存(I)
  8. 若对象并未覆盖finalize方法,JVM会进行优化,直接回收对象(O)
  9. 注:System.runFinalizersOnExit()等方法可以使对象即使处于reachable状态,JVM仍对其执行finalize方法

4. 一些代码示例

(1) 对象复活

  1. publicclass publicstaticnull publicstaticvoidthrows new null );
  2. ifnull
  3. else null );
  4. ifnull else
  5. protectedvoidthrows super this }

(2)覆盖finalize方法以确保资源释放

作为一个补充操作,以防用户忘记“关闭“资源,JDK中FileInputStream、FileOutputStream、Connection类均用了此”技术“,下面代码摘自FileInputStream类

  1. /**
  2.  * Ensures that the <code>close</code> method of this file input stream is
  3.  * called when there are no more references to it.
  4.  *
  5.  * @exception  IOException  if an I/O error occurs.
  6.  * @see        java.io.FileInputStream#close()
  7.  */ protectedvoidthrows ifnull          * will ensure that finalizer is only called when
  8.          * safe to do so. All references using the fd have
  9.          * become unreachable. We can call close()
  10.          */ }
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速