在本文中,我们将为您详细介绍docker删除镜像的时候报错--imagehasdependentchildimages的相关知识,并且为您解答关于docker删除镜像失败的疑问,此外,我们还会提供一些
在本文中,我们将为您详细介绍docker 删除镜像的时候报错 --image has dependent child images的相关知识,并且为您解答关于docker删除镜像失败的疑问,此外,我们还会提供一些关于25.week4 docker build 也就是创建自己的image 上传image到dockerhub 从dockerhub下载images、android – FragmentStatePagerAdapter with ChildFragmentManager – FragmentManagerImpl.getFragment导、com.facebook.imagepipeline.image.EncodedImage的实例源码、ConvenientImagePicker iOS 简洁优雅的 imagepicker的有用信息。
本文目录一览:- docker 删除镜像的时候报错 --image has dependent child images(docker删除镜像失败)
- 25.week4 docker build 也就是创建自己的image 上传image到dockerhub 从dockerhub下载images
- android – FragmentStatePagerAdapter with ChildFragmentManager – FragmentManagerImpl.getFragment导
- com.facebook.imagepipeline.image.EncodedImage的实例源码
- ConvenientImagePicker iOS 简洁优雅的 imagepicker
docker 删除镜像的时候报错 --image has dependent child images(docker删除镜像失败)
背景
偶然间发现服务器上有很多镜像占用不少空间,想清理一下。
结果直接进行删除报错:
docker rmi 8f5116cbc201
Error response from daemon: conflict: unable to delete 8f5116cbc201 (cannot be forced) - image has dependent child images
然后上网需求方法,主流的方法有两种
方法一:强制删除镜像
docker rmi -f 8f5116cbc201
Error response from daemon: conflict: unable to delete 8f5116cbc201 (cannot be forced) - image has dependent child images
以失败告终。。。
方法二:批量删除容器,再删除镜像
# 停止所有容器
docker ps -a | grep "Exited" | awk ''{print $1 }''|xargs docker stop
# 删除所有容器
docker ps -a | grep "Exited" | awk ''{print $1 }''|xargs docker rm
# 删除所有none镜像
docker images|grep none|awk ''{print $3 }''|xargs docker rmi
还是以失败告终。。。。。
原因
搜了很久,发现其实是因为 TAG 的问题,即有其他 image FROM 了这个 image,可以使用下面的命令列出所有在指定 image 之后创建的 image 的父 image
方案
先查询依赖
docker image inspect --format=''{{.RepoTags}} {{.Id}} {{.Parent}}'' $(docker image ls -q --filter since=XXX) # XXX 指镜像 ID
然后根据根据 TAG 删除容器
docker rm REPOSITORY:TAG
补充
docker none 镜像
有效的 none 镜像
Docker 文件系统的组成,docker 镜像是由很多 layers 组成的,每个 layer 之间有父子关系,所有的 docker 文件系统层默认都存储在 /var/lib/docker/graph 目录下,docker 称之为图层数据库。
最后做一个总结 <none>:< none> 镜像是一种中间镜像,我们可以使用 docker images -a 来看到,他们不会造成硬盘空间占用的问题(因为这是镜像的父层,必须存在的),但是会给我们的判断带来迷惑。
无效的 none 镜像
另一种类型的 <none>:< none> 镜像是 dangling images ,这种类型会造成磁盘空间占用问题。
像 Java 和 Golang 这种编程语言都有一个内存区,这个内存区不会关联任何的代码。这些语言的垃圾回收系统优先回收这块区域的空间,将他返回给堆内存,所以这块内存区对于之后的内存分配是有用的
docker 的悬挂 (dangling) 文件系统与上面的原理类似,他是没有被使用到的并且不会关联任何镜像,因此我们需要一种机制去清理这些悬空镜像。
我们在上文已经提到了有效的 <none> 镜像,他们是一种中间层,那无效的 < none > 镜像又是怎么出现的?这些 dangling 镜像主要是我们触发 docker build 和 docker pull 命令产生的。
使用下面的命令可以清理
docker rmi $(docker images -f “dangling=true” -q)
docker 没有自动垃圾回收处理机制,未来可能会有这方面的改进,但是目前我们只能这样手动清理(写个脚本就好)。
25.week4 docker build 也就是创建自己的image 上传image到dockerhub 从dockerhub下载images
dado可以写你自己的名字
这个命令就会根据目录下的Dockerfile(固定用和这个名字)文件里面的内容 去下载并创建运行命令一步一步地


Setting up libxfixes3:amd64 (1:5.0.1-2) ...
Setting up libxinerama1:amd64 (2:1.1.3-1) ...
Setting up libxshmfence1:amd64 (1.2-1) ...
Setting up libxtst6:amd64 (2:1.2.2-1) ...
Setting up libxxf86vm1:amd64 (1:1.1.4-1) ...
Setting up libjbig0:amd64 (2.1-3.1) ...
Setting up libtxc-dxtn-s2tc0:amd64 (0~git20131104-1.1) ...
update-alternatives: using /usr/lib/x86_64-linux-gnu/libtxc_dxtn_s2tc.so.0 to provide /usr/lib/x86_64-linux-gnu/libtxc_dxtn.so (libtxc-dxtn-x86_64-linux-gnu) in auto mode
Setting up libbsd0:amd64 (0.8.2-1) ...
Setting up libnettle6:amd64 (3.2-1ubuntu0.16.04.1) ...
Setting up libhogweed4:amd64 (3.2-1ubuntu0.16.04.1) ...
Setting up libidn11:amd64 (1.32-3ubuntu1.2) ...
Setting up libp11-kit0:amd64 (0.23.2-5~ubuntu16.04.1) ...
Setting up libtasn1-6:amd64 (4.7-3ubuntu0.16.04.3) ...
Setting up libgnutls30:amd64 (3.4.10-4ubuntu1.4) ...
Setting up libsqlite3-0:amd64 (3.11.0-1ubuntu1) ...
Setting up libssl1.0.0:amd64 (1.0.2g-1ubuntu4.13) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can''t locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 /usr/local/share/perl/5.22.1 /usr/lib/x86_64-linux-gnu/perl5/5.22 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base .) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)
debconf: falling back to frontend: Teletype
Setting up openssl (1.0.2g-1ubuntu4.13) ...
Setting up ca-certificates (20170717~16.04.1) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can''t locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 /usr/local/share/perl/5.22.1 /usr/lib/x86_64-linux-gnu/perl5/5.22 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base .) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)
debconf: falling back to frontend: Teletype
Setting up libcap-ng0:amd64 (0.7.7-1) ...
Setting up libdbus-1-3:amd64 (1.10.6-1ubuntu3.3) ...
Setting up dbus (1.10.6-1ubuntu3.3) ...
Setting up krb5-locales (1.13.2+dfsg-5ubuntu2) ...
Setting up libdrm-common (2.4.91-2~16.04.1) ...
Setting up libdrm2:amd64 (2.4.91-2~16.04.1) ...
Setting up libedit2:amd64 (3.1-20150325-1ubuntu2) ...
Setting up libelf1:amd64 (0.165-3ubuntu1.1) ...
Setting up libglib2.0-data (2.48.2-0ubuntu4) ...
Setting up libkrb5support0:amd64 (1.13.2+dfsg-5ubuntu2) ...
Setting up libk5crypto3:amd64 (1.13.2+dfsg-5ubuntu2) ...
Setting up libkeyutils1:amd64 (1.5.9-8ubuntu1) ...
Setting up libkrb5-3:amd64 (1.13.2+dfsg-5ubuntu2) ...
Setting up libgssapi-krb5-2:amd64 (1.13.2+dfsg-5ubuntu2) ...
Setting up libicu55:amd64 (55.1-7ubuntu0.4) ...
Setting up libxml2:amd64 (2.9.3+dfsg1-1ubuntu0.6) ...
Setting up shared-mime-info (1.5-2ubuntu0.2) ...
Setting up xdg-user-dirs (0.15-2ubuntu6.16.04.1) ...
Setting up xml-core (0.13+nmu2) ...
Setting up java-common (0.56ubuntu2) ...
Setting up libavahi-common-data:amd64 (0.6.32~rc+dfsg-1ubuntu2.2) ...
Setting up libavahi-common3:amd64 (0.6.32~rc+dfsg-1ubuntu2.2) ...
Setting up libavahi-client3:amd64 (0.6.32~rc+dfsg-1ubuntu2.2) ...
Setting up libcups2:amd64 (2.1.3-4ubuntu0.5) ...
Setting up libjpeg8:amd64 (8c-2ubuntu8) ...
Setting up libnspr4:amd64 (2:4.13.1-0ubuntu0.16.04.1) ...
Setting up libpcsclite1:amd64 (1.8.14-1ubuntu1.16.04.1) ...
Setting up libxi6:amd64 (2:1.7.6-1) ...
Setting up libxrender1:amd64 (1:0.9.9-0ubuntu1) ...
Setting up fonts-dejavu-extra (2.35-1) ...
Setting up hicolor-icon-theme (0.15-0ubuntu1.1) ...
Setting up libasound2-data (1.1.0-0ubuntu1) ...
Setting up libasound2:amd64 (1.1.0-0ubuntu1) ...
Setting up libatk1.0-data (2.18.0-1) ...
Setting up libatk1.0-0:amd64 (2.18.0-1) ...
Setting up libpixman-1-0:amd64 (0.33.6-1) ...
Setting up libxcb-render0:amd64 (1.11.1-1ubuntu1) ...
Setting up libxcb-shm0:amd64 (1.11.1-1ubuntu1) ...
Setting up libcairo2:amd64 (1.14.6-1) ...
Setting up libdatrie1:amd64 (0.2.10-2) ...
Setting up libdrm-amdgpu1:amd64 (2.4.91-2~16.04.1) ...
Setting up libpciaccess0:amd64 (0.13.4-1) ...
Setting up libdrm-intel1:amd64 (2.4.91-2~16.04.1) ...
Setting up libdrm-nouveau2:amd64 (2.4.91-2~16.04.1) ...
Setting up libdrm-radeon1:amd64 (2.4.91-2~16.04.1) ...
Setting up libflac8:amd64 (1.3.1-4) ...
Setting up libtiff5:amd64 (4.0.6-1ubuntu0.4) ...
Setting up libgdk-pixbuf2.0-common (2.32.2-1ubuntu1.5) ...
Setting up libgdk-pixbuf2.0-0:amd64 (2.32.2-1ubuntu1.5) ...
Setting up libgif7:amd64 (5.1.4-0.3~16.04) ...
Setting up libglapi-mesa:amd64 (18.0.5-0ubuntu0~16.04.1) ...
Setting up libllvm6.0:amd64 (1:6.0-1ubuntu2~16.04.1) ...
Setting up libsensors4:amd64 (1:3.4.0-2) ...
Setting up libgl1-mesa-dri:amd64 (18.0.5-0ubuntu0~16.04.1) ...
Setting up libx11-xcb1:amd64 (2:1.6.3-1ubuntu2) ...
Setting up libxcb-dri2-0:amd64 (1.11.1-1ubuntu1) ...
Setting up libxcb-dri3-0:amd64 (1.11.1-1ubuntu1) ...
Setting up libxcb-glx0:amd64 (1.11.1-1ubuntu1) ...
Setting up libxcb-present0:amd64 (1.11.1-1ubuntu1) ...
Setting up libxcb-sync1:amd64 (1.11.1-1ubuntu1) ...
Setting up libgl1-mesa-glx:amd64 (18.0.5-0ubuntu0~16.04.1) ...
update-alternatives: using /usr/lib/x86_64-linux-gnu/mesa/ld.so.conf to provide /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf (x86_64-linux-gnu_gl_conf) in auto mode
Setting up libgraphite2-3:amd64 (1.3.10-0ubuntu0.16.04.1) ...
Setting up libgtk2.0-common (2.24.30-1ubuntu1.16.04.2) ...
Setting up libthai-data (0.1.24-2) ...
Setting up libthai0:amd64 (0.1.24-2) ...
Setting up libpango-1.0-0:amd64 (1.38.1-1) ...
Setting up libharfbuzz0b:amd64 (1.0.1-1ubuntu0.1) ...
Setting up libpangoft2-1.0-0:amd64 (1.38.1-1) ...
Setting up libpangocairo-1.0-0:amd64 (1.38.1-1) ...
Setting up libxcursor1:amd64 (1:1.1.14-1ubuntu0.16.04.2) ...
Setting up libxrandr2:amd64 (2:1.5.0-1) ...
Setting up libgtk2.0-0:amd64 (2.24.30-1ubuntu1.16.04.2) ...
Setting up libgtk2.0-bin (2.24.30-1ubuntu1.16.04.2) ...
Setting up xorg-sgml-doctools (1:1.11-1) ...
Setting up x11proto-core-dev (7.0.31-1~ubuntu16.04.2) ...
Setting up libice-dev:amd64 (2:1.0.9-1) ...
Setting up libpthread-stubs0-dev:amd64 (0.3-4) ...
Setting up libvorbis0a:amd64 (1.3.5-3ubuntu0.2) ...
Setting up libvorbisenc2:amd64 (1.3.5-3ubuntu0.2) ...
Setting up libsndfile1:amd64 (1.0.25-10ubuntu0.16.04.1) ...
Setting up libpulse0:amd64 (1:8.0-0ubuntu3.10) ...
Setting up libsm-dev:amd64 (2:1.2.2-1) ...
Setting up libxau-dev:amd64 (1:1.0.8-1) ...
Setting up libxdmcp-dev:amd64 (1:1.1.2-1.1) ...
Setting up x11proto-input-dev (2.3.1-1) ...
Setting up x11proto-kb-dev (1.0.7-0ubuntu1) ...
Setting up xtrans-dev (1.3.5-1) ...
Setting up libxcb1-dev:amd64 (1.11.1-1ubuntu1) ...
Setting up libx11-dev:amd64 (2:1.6.3-1ubuntu2) ...
Setting up libx11-doc (2:1.6.3-1ubuntu2) ...
Setting up libxt6:amd64 (1:1.1.5-0ubuntu1) ...
Setting up libxt-dev:amd64 (1:1.1.5-0ubuntu1) ...
Setting up tcpd (7.6.q-25) ...
Setting up libnss3-nssdb (2:3.28.4-0ubuntu0.16.04.3) ...
Setting up libnss3:amd64 (2:3.28.4-0ubuntu0.16.04.3) ...
Setting up openjdk-8-jre-headless:amd64 (8u181-b13-0ubuntu0.16.04.1) ...
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmid to provide /usr/bin/rmid (rmid) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/keytool to provide /usr/bin/keytool (keytool) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/jjs to provide /usr/bin/jjs (jjs) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/pack200 to provide /usr/bin/pack200 (pack200) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmiregistry to provide /usr/bin/rmiregistry (rmiregistry) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/orbd to provide /usr/bin/orbd (orbd) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/servertool to provide /usr/bin/servertool (servertool) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/tnameserv to provide /usr/bin/tnameserv (tnameserv) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jexec to provide /usr/bin/jexec (jexec) in auto mode
Setting up ca-certificates-java (20160321ubuntu1) ...
done.
Setting up openjdk-8-jre:amd64 (8u181-b13-0ubuntu0.16.04.1) ...
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/policytool to provide /usr/bin/policytool (policytool) in auto mode
Setting up openjdk-8-jdk-headless:amd64 (8u181-b13-0ubuntu0.16.04.1) ...
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/idlj to provide /usr/bin/idlj (idlj) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jdeps to provide /usr/bin/jdeps (jdeps) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/wsimport to provide /usr/bin/wsimport (wsimport) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/rmic to provide /usr/bin/rmic (rmic) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jinfo to provide /usr/bin/jinfo (jinfo) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jsadebugd to provide /usr/bin/jsadebugd (jsadebugd) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/native2ascii to provide /usr/bin/native2ascii (native2ascii) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jstat to provide /usr/bin/jstat (jstat) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javac to provide /usr/bin/javac (javac) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javah to provide /usr/bin/javah (javah) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jps to provide /usr/bin/jps (jps) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jstack to provide /usr/bin/jstack (jstack) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jrunscript to provide /usr/bin/jrunscript (jrunscript) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javadoc to provide /usr/bin/javadoc (javadoc) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jhat to provide /usr/bin/jhat (jhat) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javap to provide /usr/bin/javap (javap) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jar to provide /usr/bin/jar (jar) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/extcheck to provide /usr/bin/extcheck (extcheck) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/schemagen to provide /usr/bin/schemagen (schemagen) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/xjc to provide /usr/bin/xjc (xjc) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jmap to provide /usr/bin/jmap (jmap) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jstatd to provide /usr/bin/jstatd (jstatd) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jdb to provide /usr/bin/jdb (jdb) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/serialver to provide /usr/bin/serialver (serialver) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/wsgen to provide /usr/bin/wsgen (wsgen) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jcmd to provide /usr/bin/jcmd (jcmd) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jarsigner to provide /usr/bin/jarsigner (jarsigner) in auto mode
Setting up openjdk-8-jdk:amd64 (8u181-b13-0ubuntu0.16.04.1) ...
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/appletviewer to provide /usr/bin/appletviewer (appletviewer) in auto mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jconsole to provide /usr/bin/jconsole (jconsole) in auto mode
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Processing triggers for systemd (229-4ubuntu21.2) ...
Processing triggers for ca-certificates (20170717~16.04.1) ...
Updating certificates in /etc/ssl/certs...
148 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
Adding debian:ACCVRAIZ1.pem
Adding debian:ACEDICOM_Root.pem
Adding debian:AC_RAIZ_FNMT-RCM.pem
Adding debian:Actalis_Authentication_Root_CA.pem
Adding debian:AddTrust_External_Root.pem
Adding debian:AddTrust_Low-Value_Services_Root.pem
Adding debian:AddTrust_Public_Services_Root.pem
Adding debian:AddTrust_Qualified_Certificates_Root.pem
Adding debian:AffirmTrust_Commercial.pem
Adding debian:AffirmTrust_Networking.pem
Adding debian:AffirmTrust_Premium.pem
Adding debian:AffirmTrust_Premium_ECC.pem
Adding debian:Amazon_Root_CA_1.pem
Adding debian:Amazon_Root_CA_2.pem
Adding debian:Amazon_Root_CA_3.pem
Adding debian:Amazon_Root_CA_4.pem
Adding debian:Atos_TrustedRoot_2011.pem
Adding debian:Autoridad_de_Certificacion_Firmaprofesional_CIF_A62634068.pem
Adding debian:Baltimore_CyberTrust_Root.pem
Adding debian:Buypass_Class_2_Root_CA.pem
Adding debian:Buypass_Class_3_Root_CA.pem
Adding debian:CA_Disig_Root_R1.pem
Adding debian:CA_Disig_Root_R2.pem
Adding debian:CFCA_EV_ROOT.pem
Adding debian:CNNIC_ROOT.pem
Adding debian:COMODO_Certification_Authority.pem
Adding debian:COMODO_ECC_Certification_Authority.pem
Adding debian:COMODO_RSA_Certification_Authority.pem
Adding debian:Camerfirma_Chambers_of_Commerce_Root.pem
Adding debian:Camerfirma_Global_Chambersign_Root.pem
Adding debian:Certigna.pem
Adding debian:Certinomis_-_Autorité_Racine.pem
Adding debian:Certinomis_-_Root_CA.pem
Adding debian:Certplus_Class_2_Primary_CA.pem
Adding debian:Certplus_Root_CA_G1.pem
Adding debian:Certplus_Root_CA_G2.pem
Adding debian:Certum_Root_CA.pem
Adding debian:Certum_Trusted_Network_CA.pem
Adding debian:Certum_Trusted_Network_CA_2.pem
Adding debian:Chambers_of_Commerce_Root_-_2008.pem
Adding debian:China_Internet_Network_Information_Center_EV_Certificates_Root.pem
Adding debian:Comodo_AAA_Services_root.pem
Adding debian:Comodo_Secure_Services_root.pem
Adding debian:Comodo_Trusted_Services_root.pem
Adding debian:Cybertrust_Global_Root.pem
Adding debian:D-TRUST_Root_Class_3_CA_2_2009.pem
Adding debian:D-TRUST_Root_Class_3_CA_2_EV_2009.pem
Adding debian:DST_ACES_CA_X6.pem
Adding debian:DST_Root_CA_X3.pem
Adding debian:Deutsche_Telekom_Root_CA_2.pem
Adding debian:DigiCert_Assured_ID_Root_CA.pem
Adding debian:DigiCert_Assured_ID_Root_G2.pem
Adding debian:DigiCert_Assured_ID_Root_G3.pem
Adding debian:DigiCert_Global_Root_CA.pem
Adding debian:DigiCert_Global_Root_G2.pem
Adding debian:DigiCert_Global_Root_G3.pem
Adding debian:DigiCert_High_Assurance_EV_Root_CA.pem
Adding debian:DigiCert_Trusted_Root_G4.pem
Adding debian:E-Tugra_Certification_Authority.pem
Adding debian:EC-ACC.pem
Adding debian:EE_Certification_Centre_Root_CA.pem
Adding debian:Entrust.net_Premium_2048_Secure_Server_CA.pem
Adding debian:Entrust_Root_Certification_Authority.pem
Adding debian:Entrust_Root_Certification_Authority_-_EC1.pem
Adding debian:Entrust_Root_Certification_Authority_-_G2.pem
Adding debian:GeoTrust_Global_CA.pem
Adding debian:GeoTrust_Global_CA_2.pem
Adding debian:GeoTrust_Primary_Certification_Authority.pem
Adding debian:GeoTrust_Primary_Certification_Authority_-_G2.pem
Adding debian:GeoTrust_Primary_Certification_Authority_-_G3.pem
Adding debian:GeoTrust_Universal_CA.pem
Adding debian:GeoTrust_Universal_CA_2.pem
Adding debian:GlobalSign_ECC_Root_CA_-_R4.pem
Adding debian:GlobalSign_ECC_Root_CA_-_R5.pem
Adding debian:GlobalSign_Root_CA.pem
Adding debian:GlobalSign_Root_CA_-_R2.pem
Adding debian:GlobalSign_Root_CA_-_R3.pem
Adding debian:Global_Chambersign_Root_-_2008.pem
Adding debian:Go_Daddy_Class_2_CA.pem
Adding debian:Go_Daddy_Root_Certificate_Authority_-_G2.pem
Adding debian:Hellenic_Academic_and_Research_Institutions_ECC_RootCA_2015.pem
Adding debian:Hellenic_Academic_and_Research_Institutions_RootCA_2011.pem
Adding debian:Hellenic_Academic_and_Research_Institutions_RootCA_2015.pem
Adding debian:Hongkong_Post_Root_CA_1.pem
Adding debian:ISRG_Root_X1.pem
Adding debian:IdenTrust_Commercial_Root_CA_1.pem
Adding debian:IdenTrust_Public_Sector_Root_CA_1.pem
Adding debian:Izenpe.com.pem
Adding debian:LuxTrust_Global_Root_2.pem
Adding debian:Microsec_e-Szigno_Root_CA_2009.pem
Adding debian:NetLock_Arany_=Class_Gold=_Főtanúsítvány.pem
Adding debian:Network_Solutions_Certificate_Authority.pem
Adding debian:OISTE_WISeKey_Global_Root_GA_CA.pem
Adding debian:OISTE_WISeKey_Global_Root_GB_CA.pem
Adding debian:OpenTrust_Root_CA_G1.pem
Adding debian:OpenTrust_Root_CA_G2.pem
Adding debian:OpenTrust_Root_CA_G3.pem
Adding debian:PSCProcert.pem
Adding debian:QuoVadis_Root_CA.pem
Adding debian:QuoVadis_Root_CA_1_G3.pem
Adding debian:QuoVadis_Root_CA_2.pem
Adding debian:QuoVadis_Root_CA_2_G3.pem
Adding debian:QuoVadis_Root_CA_3.pem
Adding debian:QuoVadis_Root_CA_3_G3.pem
Adding debian:SZAFIR_ROOT_CA2.pem
Adding debian:SecureSign_RootCA11.pem
Adding debian:SecureTrust_CA.pem
Adding debian:Secure_Global_CA.pem
Adding debian:Security_Communication_EV_RootCA1.pem
Adding debian:Security_Communication_RootCA2.pem
Adding debian:Security_Communication_Root_CA.pem
Adding debian:Sonera_Class_2_Root_CA.pem
Adding debian:Staat_der_Nederlanden_EV_Root_CA.pem
Adding debian:Staat_der_Nederlanden_Root_CA_-_G2.pem
Adding debian:Staat_der_Nederlanden_Root_CA_-_G3.pem
Adding debian:Starfield_Class_2_CA.pem
Adding debian:Starfield_Root_Certificate_Authority_-_G2.pem
Adding debian:Starfield_Services_Root_Certificate_Authority_-_G2.pem
Adding debian:SwissSign_Gold_CA_-_G2.pem
Adding debian:SwissSign_Silver_CA_-_G2.pem
Adding debian:Swisscom_Root_CA_1.pem
Adding debian:Swisscom_Root_CA_2.pem
Adding debian:Swisscom_Root_EV_CA_2.pem
Adding debian:T-TeleSec_GlobalRoot_Class_2.pem
Adding debian:T-TeleSec_GlobalRoot_Class_3.pem
Adding debian:TUBITAK_Kamu_SM_SSL_Kok_Sertifikasi_-_Surum_1.pem
Adding debian:TURKTRUST_Certificate_Services_Provider_Root_2007.pem
Adding debian:TWCA_Global_Root_CA.pem
Adding debian:TWCA_Root_Certification_Authority.pem
Adding debian:Taiwan_GRCA.pem
Adding debian:TeliaSonera_Root_CA_v1.pem
Adding debian:Trustis_FPS_Root_CA.pem
Adding debian:TÜBİTAK_UEKAE_Kök_Sertifika_Hizmet_Sağlayıcısı_-_Sürüm_3.pem
Adding debian:TÜRKTRUST_Elektronik_Sertifika_Hizmet_Sağlayıcısı_H5.pem
Adding debian:USERTrust_ECC_Certification_Authority.pem
Adding debian:USERTrust_RSA_Certification_Authority.pem
Adding debian:UTN_USERFirst_Hardware_Root_CA.pem
Adding debian:VeriSign_Class_3_Public_Primary_Certification_Authority_-_G4.pem
Adding debian:VeriSign_Class_3_Public_Primary_Certification_Authority_-_G5.pem
Adding debian:VeriSign_Universal_Root_Certification_Authority.pem
Adding debian:Verisign_Class_3_Public_Primary_Certification_Authority_-_G3.pem
Adding debian:Visa_eCommerce_Root.pem
Adding debian:XRamp_Global_CA_Root.pem
Adding debian:certSIGN_ROOT_CA.pem
Adding debian:ePKI_Root_Certification_Authority.pem
Adding debian:thawte_Primary_Root_CA.pem
Adding debian:thawte_Primary_Root_CA_-_G2.pem
Adding debian:thawte_Primary_Root_CA_-_G3.pem
done.
done.
Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
Removing intermediate container 0f23a95bea42
---> 8f93746ccfe5
Step 7/7 : RUN apt-get install -y python
---> Running in fc2aeb8c23dd
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
file libmagic1 libpython-stdlib libpython2.7-minimal libpython2.7-stdlib
mime-support python-minimal python2.7 python2.7-minimal
Suggested packages:
python-doc python-tk python2.7-doc binfmt-support
The following NEW packages will be installed:
file libmagic1 libpython-stdlib libpython2.7-minimal libpython2.7-stdlib
mime-support python python-minimal python2.7 python2.7-minimal
0 upgraded, 10 newly installed, 0 to remove and 6 not upgraded.
Need to get 4145 kB of archives.
After this operation, 20.9 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libpython2.7-minimal amd64 2.7.12-1ubuntu0~16.04.3 [340 kB]
Get:2 http://101.44.1.125/files/B067000006FC9787/ubuntu.cn99.com/ubuntu xenial-updates/main amd64 python2.7-minimal amd64 2.7.12-1ubuntu0~16.04.3 [1261 kB]
Get:3 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 python-minimal amd64 2.7.12-1~16.04 [28.1 kB]
Get:4 http://archive.ubuntu.com/ubuntu xenial/main amd64 mime-support all 3.59ubuntu1 [31.0 kB]
Get:5 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libpython2.7-stdlib amd64 2.7.12-1ubuntu0~16.04.3 [1880 kB]
Get:6 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 python2.7 amd64 2.7.12-1ubuntu0~16.04.3 [224 kB]
Get:7 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libpython-stdlib amd64 2.7.12-1~16.04 [7768 B]
Get:8 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 python amd64 2.7.12-1~16.04 [137 kB]
Get:9 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libmagic1 amd64 1:5.25-2ubuntu1.1 [216 kB]
Get:10 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 file amd64 1:5.25-2ubuntu1.1 [21.2 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 4145 kB in 8s (517 kB/s)
Selecting previously unselected package libpython2.7-minimal:amd64.
(Reading database ... 14046 files and directories currently installed.)
Preparing to unpack .../libpython2.7-minimal_2.7.12-1ubuntu0~16.04.3_amd64.deb ...
Unpacking libpython2.7-minimal:amd64 (2.7.12-1ubuntu0~16.04.3) ...
Selecting previously unselected package python2.7-minimal.
Preparing to unpack .../python2.7-minimal_2.7.12-1ubuntu0~16.04.3_amd64.deb ...
Unpacking python2.7-minimal (2.7.12-1ubuntu0~16.04.3) ...
Selecting previously unselected package python-minimal.
Preparing to unpack .../python-minimal_2.7.12-1~16.04_amd64.deb ...
Unpacking python-minimal (2.7.12-1~16.04) ...
Selecting previously unselected package mime-support.
Preparing to unpack .../mime-support_3.59ubuntu1_all.deb ...
Unpacking mime-support (3.59ubuntu1) ...
Selecting previously unselected package libpython2.7-stdlib:amd64.
Preparing to unpack .../libpython2.7-stdlib_2.7.12-1ubuntu0~16.04.3_amd64.deb ...
Unpacking libpython2.7-stdlib:amd64 (2.7.12-1ubuntu0~16.04.3) ...
Selecting previously unselected package python2.7.
Preparing to unpack .../python2.7_2.7.12-1ubuntu0~16.04.3_amd64.deb ...
Unpacking python2.7 (2.7.12-1ubuntu0~16.04.3) ...
Selecting previously unselected package libpython-stdlib:amd64.
Preparing to unpack .../libpython-stdlib_2.7.12-1~16.04_amd64.deb ...
Unpacking libpython-stdlib:amd64 (2.7.12-1~16.04) ...
Setting up libpython2.7-minimal:amd64 (2.7.12-1ubuntu0~16.04.3) ...
Setting up python2.7-minimal (2.7.12-1ubuntu0~16.04.3) ...
Linking and byte-compiling packages for runtime python2.7...
Setting up python-minimal (2.7.12-1~16.04) ...
Selecting previously unselected package python.
(Reading database ... 14818 files and directories currently installed.)
Preparing to unpack .../python_2.7.12-1~16.04_amd64.deb ...
Unpacking python (2.7.12-1~16.04) ...
Selecting previously unselected package libmagic1:amd64.
Preparing to unpack .../libmagic1_1%3a5.25-2ubuntu1.1_amd64.deb ...
Unpacking libmagic1:amd64 (1:5.25-2ubuntu1.1) ...
Selecting previously unselected package file.
Preparing to unpack .../file_1%3a5.25-2ubuntu1.1_amd64.deb ...
Unpacking file (1:5.25-2ubuntu1.1) ...
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Setting up mime-support (3.59ubuntu1) ...
Setting up libpython2.7-stdlib:amd64 (2.7.12-1ubuntu0~16.04.3) ...
Setting up python2.7 (2.7.12-1ubuntu0~16.04.3) ...
Setting up libpython-stdlib:amd64 (2.7.12-1~16.04) ...
Setting up python (2.7.12-1~16.04) ...
Setting up libmagic1:amd64 (1:5.25-2ubuntu1.1) ...
Setting up file (1:5.25-2ubuntu1.1) ...
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Removing intermediate container fc2aeb8c23dd
---> 057807ccc7d8
Successfully built 057807ccc7d8
Successfully tagged hanshanyang/coj_demo_01:latest
安装完成我们
等他安装完成 会把这个状态创建成一个image存在本地
然后我们在 push到docker hub上去(远程) 和我们的git很相似
我们登录到docker hub上去(自己去官网创建账号)
登录上了
我们就要push了
这说明上传成功
那么从docker hub 下拉image也很简单 就是 pull
如果你本地有这个image他会自动更新到最新的
如果你要删除
android – FragmentStatePagerAdapter with ChildFragmentManager – FragmentManagerImpl.getFragment导
编辑2
我现在设法通过使用来自这里https://code.google.com/p/android/issues/detail?id=42601#c10的技巧摆脱了错误,这就是为什么我的最后一次编辑放在我的问题之上的原因.
但这导致了下一个错误:
java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:569)
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211)
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1281)
at android.view.View.dispatchRestoreInstanceState(View.java:12043)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2688)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694)
at android.view.View.restoreHierarchyState(View.java:12021)
at android.support.v4.app.Fragment.restoreViewState(Fragment.java:425)
at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:949)
at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4800)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)
现在我不知道从哪里继续……
编辑0 – 第一个问题
我得到以下异常:
java.lang.IllegalStateException: No activity
at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1091)
at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1086)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1492)
at android.support.v4.app._HoloFragment.performActivityCreated(_HoloFragment.java:251)
at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:947)
at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4800)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)
我不知道从哪里开始.我正在使用最新的支持库(v4,rev18).
一切正常,直到我添加一个Fragment,它将ViewPager与FragmentStatePagerAdapter结合在一起.
我到处都在使用支持库,我尝试了https://code.google.com/p/android/issues/detail?id=42601的解决方案……
但还没有任何效果……
我不知道从哪里开始,有人有提示吗?
编辑1:背景和代码
1)在我的MainActivity中,我使用以下内容:
第三页有viewpager …
public void setPage(int pos, boolean addToBackStack)
{
Fragment nextFragment = null;
FragmentTransaction transaction = null;
switch (pos)
{
case 0:
if (mFragmentAllRoutines == null)
mFragmentAllRoutines = new RoutinesListFragment();
if (!mFragmentAllRoutines.isVisible())
nextFragment = mFragmentAllRoutines;
break;
case 1:
if (mFragmentRoutine == null)
mFragmentRoutine = new RoutineFragment();
if (!mFragmentRoutine.isVisible())
nextFragment = mFragmentRoutine;
break;
case 2:
if (mFragmentDay == null)
mFragmentDay = new RoutineDayFragment();
if (!mFragmentDay.isVisible())
nextFragment = mFragmentDay;
break;
default:
break;
}
if (nextFragment != null)
{
// Fragment prevFragment = getSupportFragmentManager().findFragmentById(R.id.fragment);
transaction = getSupportFragmentManager().beginTransaction();
// if (prevFragment != null)
// transaction.detach(prevFragment);
transaction.replace(R.id.fragment, nextFragment, nextFragment.getClass().getName());
// transaction.attach(nextFragment);
if (addToBackStack)
transaction.addToBackStack(null);
transaction.commit();
}
}
2)第三个片段:
它是一个带有ViewPager和FragmentStatePagerAdapter的简单片段. FragmentStatePagerAdapter将getChildFragmentManager()作为FragmentManager获取.在某个地方似乎存在问题.
解决方法:
我需要看到更多的代码才能知道在哪里应用这个……但是我遇到了类似的情况……我以同样的方式解决了ChildFragmentManager问题,并得到了与你一样的NullPointerException.
我确实设法解决了……我会尝试描述我的解决方案,就像你提供的代码一样,我不确定在哪里应用“修复”…这真的是一个修复…它不是一个优雅的方式解决这个问题!然而它确实对我有所帮助,一旦我离开视图寻呼机,我就不需要恢复状态,因此对我来说没有任何不利因素.
我有多个Fragments,它实现了代码的静态位和onDetach(在https://code.google.com/p/android/issues/detail?id=42601#c10上),每个片段都有一个寻呼机,onCreateView我附加了一个扩展FragmentStatePagerAdapter的适配器.
在那些适配器上,我已经覆盖了restoreState方法,什么都不做
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
//do nothing here! no call to super.restoreState(arg0, arg1);
}
再次,这不是最好的方式……但它确实解决了我的问题.
祝你好运!
com.facebook.imagepipeline.image.EncodedImage的实例源码
/** * Decodes a GIF into a CloseableImage. * @param encodedImage encoded image (native byte array holding the encoded bytes and Meta data) * @param options the options for the decode * @param bitmapConfig the Bitmap.Config used to generate the output bitmaps * @return a {@link CloseableImage} for the GIF image */ public CloseableImage decodeGif( final EncodedImage encodedImage,final ImageDecodeOptions options,final Bitmap.Config bitmapConfig) { if (sgifAnimatedimagedecoder == null) { throw new UnsupportedOperationException("To encode animated gif please add the dependency " + "to the animated-gif module"); } final CloseableReference<PooledByteBuffer> bytesRef = encodedImage.getByteBufferRef(); Preconditions.checkNotNull(bytesRef); try { final PooledByteBuffer input = bytesRef.get(); AnimatedImage gifImage = sgifAnimatedimagedecoder.decode(input.getNativePtr(),input.size()); return getCloseableImage(options,gifImage,bitmapConfig); } finally { CloseableReference.closeSafely(bytesRef); } }
/** * Decode a WebP into a CloseableImage. * @param encodedImage encoded image (native byte array holding the encoded bytes and Meta data) * @param options the options for the decode * @param bitmapConfig the Bitmap.Config used to generate the output bitmaps * @return a {@link CloseableImage} for the WebP image */ public CloseableImage decodeWebP( final EncodedImage encodedImage,final Bitmap.Config bitmapConfig) { if (sWebpAnimatedimagedecoder == null) { throw new UnsupportedOperationException("To encode animated webp please add the dependency " + "to the animated-webp module"); } final CloseableReference<PooledByteBuffer> bytesRef = encodedImage.getByteBufferRef(); Preconditions.checkNotNull(bytesRef); try { final PooledByteBuffer input = bytesRef.get(); AnimatedImage webPImage = sWebpAnimatedimagedecoder.decode( input.getNativePtr(),input.size()); return getCloseableImage(options,webPImage,bitmapConfig); } finally { CloseableReference.closeSafely(bytesRef); } }
@Test public void testSmallImagediskCacheGetSuccessful() { when(mImageRequest.getCacheChoice()).thenReturn(ImageRequest.CacheChoice.SMALL); setupdiskCacheGetSuccess(mSmallImageBuffereddiskCache); mdiskCacheReadProducer.produceResults(mConsumer,mProducerContext); verify(mConsumer).onNewResult(mFinalEncodedImage,Consumer.IS_LAST); verify(mProducerListener).onProducerStart(mRequestId,PRODUCER_NAME); ArgumentCaptor<HashMap> captor = ArgumentCaptor.forClass(HashMap.class); verify(mProducerListener).onProducerFinishWithSuccess( eq(mRequestId),eq(PRODUCER_NAME),captor.capture()); Map<String,String> resultMap = captor.getValue(); assertEquals("true",resultMap.get(diskCacheReadProducer.EXTRA_CACHED_VALUE_FOUND)); assertEquals( "0",resultMap.get(diskCacheReadProducer.ENCODED_IMAGE_SIZE)); verify(mProducerListener).onUltimateProducerReached(mRequestId,PRODUCER_NAME,true); Assert.assertFalse(EncodedImage.isValid(mFinalEncodedImage)); }
@Override protected void onNewResultImpl(@Nullable EncodedImage newResult,@Status int status) { // try to determine if the last result should be transformed if (mShouldTranscodeWhenFinished == TriState.UNSET && newResult != null) { mShouldTranscodeWhenFinished = shouldTranscode(newResult); } // just propagate result if it shouldn't be transformed if (mShouldTranscodeWhenFinished == TriState.NO) { getConsumer().onNewResult(newResult,status); return; } if (isLast(status)) { if (mShouldTranscodeWhenFinished == TriState.YES && newResult != null) { transcodeLastResult(newResult,getConsumer(),mContext); } else { getConsumer().onNewResult(newResult,status); } } }
/** * bitmap cache get -> * background thread hand-off -> bitmap cache -> decode -> resize and rotate -> (webp transcode) * -> data fetch. */ private synchronized Producer<CloseableReference<CloseableImage>> getDataFetchSequence() { if (mDataFetchSequence == null) { Producer<EncodedImage> inputProducer = mProducerFactory.newDataFetchProducer(); if (WebpSupportStatus.sIsWebpSupportrequired && (!mWebpSupportEnabled || WebpSupportStatus.sWebpBitmapFactory == null)) { inputProducer = mProducerFactory.newWebpTranscodeProducer(inputProducer); } inputProducer = mProducerFactory.newAddImageTransformMetaDataProducer(inputProducer); inputProducer = mProducerFactory.newResizeAndRotateProducer( inputProducer,true,mUseDownsamplingRatio); mDataFetchSequence = newBitmapCacheGetToDecodeSequence(inputProducer); } return mDataFetchSequence; }
@Test public void testFirstProducerResultNotGoodEnough() { EncodedImage firstProducerEncodedImage = new EncodedImage( mFirstProducerFinalResult.getByteBufferRef()); firstProducerEncodedImage.setRotationAngle(-1); firstProducerEncodedImage.setWidth(WIDTH / 2); firstProducerEncodedImage.setHeight(HEIGHT / 2); mFirstProducerConsumer.onNewResult(firstProducerEncodedImage,Consumer.IS_LAST); verify(mConsumer).onNewResult(firstProducerEncodedImage,Consumer.NO_FLAGS); EncodedImage intermediateEncodedImage = new EncodedImage( mIntermediateResult.getByteBufferRef()); intermediateEncodedImage.setRotationAngle(-1); intermediateEncodedImage.setWidth(WIDTH / 2); intermediateEncodedImage.setHeight(HEIGHT / 2); mSecondProducerConsumer.onNewResult(intermediateEncodedImage,Consumer.NO_FLAGS); verify(mConsumer).onNewResult(intermediateEncodedImage,Consumer.NO_FLAGS); EncodedImage secondProducerEncodedImage = new EncodedImage( mSecondProducerFinalResult.getByteBufferRef()); secondProducerEncodedImage.setRotationAngle(-1); secondProducerEncodedImage.setWidth(WIDTH / 2); secondProducerEncodedImage.setHeight(HEIGHT / 2); mSecondProducerConsumer.onNewResult(secondProducerEncodedImage,Consumer.IS_LAST); verify(mConsumer).onNewResult(secondProducerEncodedImage,Consumer.IS_LAST); }
@Test public void testEncodedMemoryCacheGetNotFoundInputProducerSuccess() { setupEncodedMemoryCacheGetNotFound(); setupInputProducerStreamingSuccess(); mEncodedMemoryCacheProducer.produceResults(mConsumer,mProducerContext); verify(mMemoryCache,never()).cache(mCacheKey,mIntermediateImageReference); ArgumentCaptor<CloseableReference> argumentCaptor = ArgumentCaptor.forClass(CloseableReference.class); verify(mMemoryCache).cache(eq(mCacheKey),argumentCaptor.capture()); CloseableReference<PooledByteBuffer> capturedRef = (CloseableReference<PooledByteBuffer>) argumentCaptor.getValue(); Assert.assertSame( mFinalImageReference.getUnderlyingReferenceTestOnly(),capturedRef.getUnderlyingReferenceTestOnly()); verify(mConsumer).onNewResult(mIntermediateEncodedImage,Consumer.NO_FLAGS); verify(mConsumer).onNewResult(mFinalEncodedImage,Consumer.IS_LAST); Assert.assertTrue(EncodedImage.isValid(mFinalEncodedImageClone)); verify(mProducerListener).onProducerStart(mRequestId,PRODUCER_NAME); Map<String,String> extraMap = ImmutableMap.of(EncodedMemoryCacheProducer.EXTRA_CACHED_VALUE_FOUND,"false"); verify(mProducerListener).onProducerFinishWithSuccess(mRequestId,extraMap); verify(mProducerListener,never()) .onUltimateProducerReached(anyString(),anyString(),anyBoolean()); }
/** * Creates a bitmap from encoded bytes. * * @param encodedImage the encoded image with reference to the encoded bytes * @param bitmapConfig the {@link android.graphics.Bitmap.Config} used to create the decoded * Bitmap * @param regionToDecode optional image region to decode. currently not supported. * @return the bitmap * @throws TooManyBitmapsException if the pool is full * @throws java.lang.OutOfMemoryError if the Bitmap cannot be allocated */ @Override public CloseableReference<Bitmap> decodeFromEncodedImage( final EncodedImage encodedImage,Bitmap.Config bitmapConfig,@Nullable Rect regionToDecode) { BitmapFactory.Options options = getBitmapFactoryOptions( encodedImage.getSampleSize(),bitmapConfig); CloseableReference<PooledByteBuffer> bytesRef = encodedImage.getByteBufferRef(); Preconditions.checkNotNull(bytesRef); try { Bitmap bitmap = decodeByteArrayAsPurgeable(bytesRef,options); return pinBitmap(bitmap); } finally { CloseableReference.closeSafely(bytesRef); } }
/** * bitmap cache get -> * background thread hand-off -> multiplex -> bitmap cache -> decode -> * branch on separate images * -> thumbnail resize and rotate -> thumbnail branch * -> local content thumbnail creation * -> exif thumbnail creation * -> local image resize and rotate -> add Meta data producer -> multiplex -> encoded cache -> * (webp transcode) -> local content uri fetch. */ private synchronized Producer<CloseableReference<CloseableImage>> getLocalContentUriFetchSequence() { if (mLocalContentUriFetchSequence == null) { LocalContentUriFetchProducer localContentUriFetchProducer = mProducerFactory.newLocalContentUriFetchProducer(); ThumbnailProducer<EncodedImage>[] thumbnailProducers = new ThumbnailProducer[2]; thumbnailProducers[0] = mProducerFactory.newLocalContentUriThumbnailFetchProducer(); thumbnailProducers[1] = mProducerFactory.newLocalExifThumbnailProducer(); mLocalContentUriFetchSequence = newBitmapCacheGetToLocalTransformSequence( localContentUriFetchProducer,thumbnailProducers); } return mLocalContentUriFetchSequence; }
/** * Options returned by this method are configured with mDecodeBuffer which is GuardedBy("this") */ private static BitmapFactory.Options getDecodeOptionsForStream( EncodedImage encodedImage,Bitmap.Config bitmapConfig) { final BitmapFactory.Options options = new BitmapFactory.Options(); // Sample size should ONLY be different than 1 when downsampling is enabled in the pipeline options.inSampleSize = encodedImage.getSampleSize(); options.inJustDecodeBounds = true; // fill outWidth and outHeight BitmapFactory.decodeStream(encodedImage.getInputStream(),null,options); if (options.outWidth == -1 || options.outHeight == -1) { throw new IllegalArgumentException(); } options.inJustDecodeBounds = false; options.inDither = true; options.inPreferredConfig = bitmapConfig; options.inMutable = true; return options; }
/** * Decodes image. * * @param encodedImage input image (encoded bytes plus Meta data) * @param length if image type supports decoding incomplete image then determines where the image * data should be cut for decoding. * @param qualityInfo quality information for the image * @param options options that cange decode behavior */ @Override public CloseableImage decode( final EncodedImage encodedImage,final int length,final QualityInfo qualityInfo,final ImageDecodeOptions options) { if (options.customimagedecoder != null) { return options.customimagedecoder.decode(encodedImage,length,qualityInfo,options); } ImageFormat imageFormat = encodedImage.getimageFormat(); if (imageFormat == null || imageFormat == ImageFormat.UNKNowN) { imageFormat = ImageFormatChecker.getimageFormat_WrapIOException( encodedImage.getInputStream()); encodedImage.setimageFormat(imageFormat); } if (mCustomDecoders != null) { imagedecoder decoder = mCustomDecoders.get(imageFormat); if (decoder != null) { return decoder.decode(encodedImage,options); } } return mDefaultDecoder.decode(encodedImage,options); }
/** * Determine if an valid entry for the key exists in the staging area. */ public synchronized boolean containsKey(CacheKey key) { Preconditions.checkNotNull(key); if (!mMap.containsKey(key)) { return false; } EncodedImage storedEncodedImage = mMap.get(key); synchronized (storedEncodedImage) { if (!EncodedImage.isValid(storedEncodedImage)) { // Reference is not valid,this means that someone cleared reference while it was still in // use. Log error // Todo: 3697790 mMap.remove(key); FLog.w( TAG,"Found closed reference %d for key %s (%d)",System.identityHashCode(storedEncodedImage),key.getUriString(),System.identityHashCode(key)); return false; } return true; } }
/** * Performs key-value loop up in staging area and file cache. * Any error manifests itself as a miss,i.e. returns false. * @param key * @return true if the image is found in staging area or File cache,false if not found */ private boolean checkInStagingAreaAndFileCache(final CacheKey key) { EncodedImage result = mStagingArea.get(key); if (result != null) { result.close(); FLog.v(TAG,"Found image for %s in staging area",key.getUriString()); mImageCacheStatsTracker.onStagingAreaHit(key); return true; } else { FLog.v(TAG,"Did not find image for %s in staging area",key.getUriString()); mImageCacheStatsTracker.onStagingAreaMiss(); try { return mFileCache.hasKey(key); } catch (Exception exception) { return false; } } }
private void mockThumbnailFile() throws Exception { powermockito.whenNew(File.class) .withArguments(THUMBNAIL_FILE_NAME) .thenReturn(mThumbnailFile); when(mThumbnailFile.exists()).thenReturn(true); when(mThumbnailFile.length()).thenReturn(THUMBNAIL_FILE_SIZE); powermockito.whenNew(FileInputStream.class) .withArguments(THUMBNAIL_FILE_NAME) .thenReturn(mock(FileInputStream.class)); EncodedImage encodedImage = mock(EncodedImage.class); when(encodedImage.getSize()).thenReturn((int) THUMBNAIL_FILE_SIZE); powermockito.whenNew(EncodedImage.class) .withAnyArguments() .thenReturn(encodedImage); }
@Override public void produceResults(Consumer<EncodedImage> consumer,ProducerContext context) { context.getListener() .onProducerStart(context.getId(),PRODUCER_NAME); final FetchState fetchState = mNetworkFetcher.createFetchState(consumer,context); mNetworkFetcher.fetch( fetchState,new NetworkFetcher.Callback() { @Override public void onResponse(InputStream response,int responseLength) throws IOException { NetworkFetchProducer.this.onResponse(fetchState,response,responseLength); } @Override public void onFailure(Throwable throwable) { NetworkFetchProducer.this.onFailure(fetchState,throwable); } @Override public void onCancellation() { NetworkFetchProducer.this.onCancellation(fetchState); } }); }
@Test public void testOnNewResultNotLast_DimensionsNotFound() { int rotationAngle = 180; int orientation = 1; when(ImageFormatChecker.getimageFormat_WrapIOException(any(InputStream.class))) .thenReturn(DefaultimageFormats.JPEG); when(JfifUtil.getAutoRotateAngleFromOrientation(orientation)).thenReturn(rotationAngle); when(JfifUtil.getorientation(any(InputStream.class))).thenReturn(orientation); when(BitmapUtil.decodeDimensions(any(InputStream.class))).thenReturn(null); mAddMetaDataConsumer.onNewResult(mIntermediateResult,Consumer.NO_FLAGS); ArgumentCaptor<EncodedImage> argumentCaptor = ArgumentCaptor.forClass(EncodedImage.class); verify(mConsumer).onNewResult(argumentCaptor.capture(),eq(Consumer.NO_FLAGS)); EncodedImage encodedImage = argumentCaptor.getValue(); assertTrue(EncodedImage.isValid(encodedImage)); assertEquals(-1,encodedImage.getRotationAngle()); assertEquals(-1,encodedImage.getWidth()); assertEquals(-1,encodedImage.getHeight()); }
@Test public void testDoesNottransformIfImageRotationAngleUnkown() { whenResizingEnabled(); whenRequestSpecificRotation(Rotationoptions.NO_ROTATION); provideIntermediateResult( DefaultimageFormats.JPEG,800,EncodedImage.UNKNowN_ROTATION_ANGLE,ExifInterface.ORIENTATION_UNDEFINED); verifyIntermediateResultPassedThroughUnchanged(); provideFinalResult( DefaultimageFormats.JPEG,ExifInterface.ORIENTATION_UNDEFINED); verifyFinalResultPassedThroughUnchanged(); verifyZeroJpegTranscoderInteractions(); }
/** * background-thread hand-off -> multiplex -> encoded cache -> * disk cache -> (webp transcode) -> local file fetch */ private synchronized Producer<EncodedImage> getBackgroundLocalFileFetchToEncodeMemorySequence() { if (mBackgroundLocalFileFetchToEncodedMemorySequence == null) { final LocalFileFetchProducer localFileFetchProducer = mProducerFactory.newLocalFileFetchProducer(); final Producer<EncodedImage> toEncodedMultiplexProducer = newEncodedCacheMultiplexToTranscodeSequence(localFileFetchProducer); mBackgroundLocalFileFetchToEncodedMemorySequence = mProducerFactory.newBackgroundThreadHandoffProducer( toEncodedMultiplexProducer,mThreadHandoffProducerQueue); } return mBackgroundLocalFileFetchToEncodedMemorySequence; }
private void verifyInputProducerProduceResultsWithNewConsumer(boolean allowIntermediateResult) { verify(mInputProducer) .produceResults(mConsumerCaptor.capture(),mProducerContextCaptor.capture()); Consumer<EncodedImage> consumer = mConsumerCaptor.getValue(); assertthat(consumer).isinstanceOf(MediaVariationsConsumer.class); assertthat(((MediaVariationsConsumer) consumer).getConsumer()).isSameAs(mConsumer); SettableProducerContext referenceContext = new SettableProducerContext(mProducerContext); referenceContext.setIsIntermediateResultExpected(allowIntermediateResult); ProducerContext capturedContext = mProducerContextCaptor.getValue(); assertEquals(referenceContext.getCallerContext(),capturedContext.getCallerContext()); assertEquals(referenceContext.getId(),capturedContext.getId()); assertEquals(referenceContext.getimageRequest(),capturedContext.getimageRequest()); assertEquals(referenceContext.getListener(),capturedContext.getListener()); assertEquals( referenceContext.getLowestPermittedRequestLevel(),capturedContext.getLowestPermittedRequestLevel()); assertEquals(referenceContext.getPriority(),capturedContext.getPriority()); assertEquals( referenceContext.isIntermediateResultExpected(),capturedContext.isIntermediateResultExpected()); }
@Override protected void onNewResultImpl(EncodedImage newResult,@Status int status) { ImageRequest request = mProducerContext.getimageRequest(); boolean isLast = isLast(status); boolean isGoodEnough = ThumbnailSizeChecker.isImageBigEnough(newResult,request.getResizeOptions()); if (newResult != null && (isGoodEnough || request.getLocalThumbnailPreviewsEnabled())) { if (isLast && isGoodEnough) { getConsumer().onNewResult(newResult,status); } else { int alteredStatus = turnOffStatusFlag(status,IS_LAST); getConsumer().onNewResult(newResult,alteredStatus); } } if (isLast && !isGoodEnough) { EncodedImage.closeSafely(newResult); mInputProducer2.produceResults(getConsumer(),mProducerContext); } }
private @Nullable EncodedImage getCameraimage(Uri uri) throws IOException { Cursor cursor = mContentResolver.query(uri,PROJECTION,null); if (cursor == null) { return null; } try { if (cursor.getCount() == 0) { return null; } cursor.movetoFirst(); final String pathname = cursor.getString(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)); if (pathname != null) { return getEncodedImage(new FileInputStream(pathname),getLength(pathname)); } } finally { cursor.close(); } return null; }
@Test public void testSchedule_Last_Queued() { mJobScheduler.updateJob(fakeEncodedImage(),Consumer.IS_LAST); assertTrue(mJobScheduler.scheduleJob()); EncodedImage encodedImage2 = fakeEncodedImage(); mJobScheduler.updateJob(encodedImage2,Consumer.IS_LAST); assertEquals(JobScheduler.JobState.QUEUED,mJobScheduler.mJobState); assertTrue(mJobScheduler.scheduleJob()); assertEquals(0,mTestscheduledexecutorservice.getPendingCount()); assertEquals(1,mTestExecutorService.getPendingCount()); assertEquals(0,mTestJobRunnable.jobs.size()); mFakeClockForTime.incrementBy(1234); mFakeClockForWorker.incrementBy(1234); mFakeClockForScheduled.incrementBy(1234); assertEquals(1,mTestJobRunnable.jobs.size()); assertJobsEqual(mTestJobRunnable.jobs.get(0),encodedImage2,Consumer.IS_LAST); }
public void produceResults( final Consumer<EncodedImage> consumer,final ProducerContext producerContext) { final ImageRequest imageRequest = producerContext.getimageRequest(); if (!imageRequest.isdiskCacheEnabled()) { maybeStartInputProducer(consumer,producerContext); return; } producerContext.getListener().onProducerStart(producerContext.getId(),PRODUCER_NAME); final CacheKey cacheKey = mCacheKeyFactory.getEncodedCacheKey(imageRequest,producerContext.getCallerContext()); final boolean isSmallRequest = (imageRequest.getCacheChoice() == CacheChoice.SMALL); final BuffereddiskCache preferredCache = isSmallRequest ? mSmallImageBuffereddiskCache : mDefaultBuffereddiskCache; final AtomicBoolean isCancelled = new AtomicBoolean(false); final Task<EncodedImage> diskLookupTask = preferredCache.get(cacheKey,isCancelled); final Continuation<EncodedImage,Void> continuation = onFinishdiskReads(consumer,producerContext); diskLookupTask.continueWith(continuation); subscribeTaskForRequestCancellation(isCancelled,producerContext); }
private static boolean shouldProcess(EncodedImage encodedImage,@Consumer.Status int status) { // the last result should always be processed,whereas // an intermediate result should be processed only if valid return BaseConsumer.isLast(status) || BaseConsumer.statusHasFlag(status,Consumer.IS_PLACEHOLDER) || EncodedImage.isValid(encodedImage); }
@Override public imagedecoder getGifDecoder(final Bitmap.Config bitmapConfig) { return new imagedecoder() { @Override public CloseableImage decode( EncodedImage encodedImage,int length,QualityInfo qualityInfo,ImageDecodeOptions options) { return getAnimatedImageFactory().decodeGif(encodedImage,options,bitmapConfig); } }; }
private void startInputProducer( Consumer<EncodedImage> consumerOfPartialdiskCacheProducer,ProducerContext producerContext,CacheKey partialImageCacheKey,@Nullable EncodedImage partialResultFromCache) { Consumer<EncodedImage> consumer = new PartialdiskCacheConsumer( consumerOfPartialdiskCacheProducer,mDefaultBuffereddiskCache,partialImageCacheKey,mPooledByteBufferFactory,mByteArrayPool,partialResultFromCache); mInputProducer.produceResults(consumer,producerContext); }
@Before public void setUp() { MockitoAnnotations.initMocks(this); mEncodedMemoryCacheProducer = new EncodedMemoryCacheProducer(mMemoryCache,mCacheKeyFactory,mInputProducer); mPooledByteBuffer1 = mock(PooledByteBuffer.class); mPooledByteBuffer2 = mock(PooledByteBuffer.class); mFinalImageReference = CloseableReference.of(mPooledByteBuffer1); mIntermediateImageReference = CloseableReference.of(mPooledByteBuffer2); mFinalImageReferenceClone = mFinalImageReference.clone(); mFinalEncodedImage = new EncodedImage(mFinalImageReference); mIntermediateEncodedImage = new EncodedImage(mIntermediateImageReference); mFinalEncodedImageClone = new EncodedImage(mFinalImageReferenceClone); List<CacheKey> list = new ArrayList<>(); list.add(new SimpleCacheKey("http://dummy.uri")); mCacheKey = new MultiCacheKey(list); when(mCacheKeyFactory.getEncodedCacheKey(mImageRequest,mCallerContext)).thenReturn(mCacheKey); when(mMemoryCache.cache(mCacheKey,mFinalImageReference)).thenReturn(mFinalImageReferenceClone); when(mProducerContext.getimageRequest()).thenReturn(mImageRequest); when(mProducerContext.getCallerContext()).thenReturn(mCallerContext); when(mProducerContext.getListener()).thenReturn(mProducerListener); when(mProducerListener.requiresExtraMap(mRequestId)).thenReturn(true); when(mProducerContext.getId()).thenReturn(mRequestId); when(mProducerContext.getLowestPermittedRequestLevel()) .thenReturn(ImageRequest.RequestLevel.FULL_FETCH); }
@Test public void testimageWithInsufficientHeightWhennoresizeOptions() { for (int rotation = 0; rotation < 360; rotation += 90) { EncodedImage mockImage = mockImage( BIG_ENOUGH_SIZE_FOR_NO_RESIZE_OPTIONS,BIG_ENOUGH_SIZE_FOR_NO_RESIZE_OPTIONS - 1,rotation); assertFalse(ThumbnailSizeChecker.isImageBigEnough(mockImage,null)); } }
/** * encoded cache multiplex -> encoded cache -> (disk cache) -> (webp transcode) * @param inputProducer producer providing the input to the transcode * @return encoded cache multiplex to webp transcode sequence */ private Producer<EncodedImage> newEncodedCacheMultiplexToTranscodeSequence( Producer<EncodedImage> inputProducer) { if (WebpSupportStatus.sIsWebpSupportrequired && (!mWebpSupportEnabled || WebpSupportStatus.sWebpBitmapFactory == null)) { inputProducer = mProducerFactory.newWebpTranscodeProducer(inputProducer); } inputProducer = newdiskCacheSequence(inputProducer); EncodedMemoryCacheProducer encodedMemoryCacheProducer = mProducerFactory.newEncodedMemoryCacheProducer(inputProducer); return mProducerFactory.newEncodedCacheKeyMultiplexProducer(encodedMemoryCacheProducer); }
/** * Clears the currently set job. * * <p> In case the currently set job has been scheduled but not started yet,the job won't be * executed. */ public void clearJob() { EncodedImage oldEncodedImage; synchronized (this) { oldEncodedImage = mEncodedImage; mEncodedImage = null; mStatus = 0; } EncodedImage.closeSafely(oldEncodedImage); }
@Test public void testClear() throws Exception { EncodedImage encodedImage = fakeEncodedImage(); mJobScheduler.updateJob(encodedImage,Consumer.IS_LAST); mJobScheduler.clearJob(); assertEquals(null,mJobScheduler.mEncodedImage); encodedImage.close(); assertNull(encodedImage.getByteBufferRef()); }
@Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mExecutor = new TestExecutorService(new FakeClock()); mLocalContentUriFetchProducer = new LocalContentUriFetchProducer( mExecutor,mContentResolver ); mContentUri = Uri.fromFile(mock(File.class)); mProducerContext = new SettableProducerContext( mImageRequest,mRequestId,mProducerListener,mock(Object.class),ImageRequest.RequestLevel.FULL_FETCH,false,Priority.MEDIUM); when(mImageRequest.getSourceUri()).thenReturn(mContentUri); doAnswer( new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { mCapturedEncodedImage = EncodedImage.cloneOrNull((EncodedImage) invocation.getArguments()[0]); return null; } }) .when(mConsumer) .onNewResult(notNull(EncodedImage.class),anyInt()); }
@Override public void saveCachedVariant( String mediaId,ImageRequest.CacheChoice cacheChoice,CacheKey cacheKey,EncodedImage encodedImage) { // no-op }
private static EncodedImage mockEncodedImage(int width,int height,int rotationAngle) { EncodedImage mockImage = mock(EncodedImage.class); when(mockImage.getWidth()).thenReturn(width); when(mockImage.getHeight()).thenReturn(height); when(mockImage.getRotationAngle()).thenReturn(rotationAngle); return mockImage; }
/** * Removes key-value from the StagingArea. Both key and value must match. * @param key * @param encodedImage value corresponding to key * @return true if item was removed */ public synchronized boolean remove(final CacheKey key,final EncodedImage encodedImage) { Preconditions.checkNotNull(key); Preconditions.checkNotNull(encodedImage); Preconditions.checkArgument(EncodedImage.isValid(encodedImage)); final EncodedImage oldValue = mMap.get(key); if (oldValue == null) { return false; } CloseableReference<PooledByteBuffer> oldRef = oldValue.getByteBufferRef(); CloseableReference<PooledByteBuffer> ref = encodedImage.getByteBufferRef(); try { if (oldRef == null || ref == null || oldRef.get() != ref.get()) { return false; } mMap.remove(key); } finally { CloseableReference.closeSafely(ref); CloseableReference.closeSafely(oldRef); EncodedImage.closeSafely(oldValue); } logStats(); return true; }
public WebpTranscodeConsumer( final Consumer<EncodedImage> consumer,final ProducerContext context) { super(consumer); mContext = context; mShouldTranscodeWhenFinished = TriState.UNSET; }
@Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mCloseableReference = CloseableReference.of(mPooledByteBuffer); mEncodedImage = new EncodedImage(mCloseableReference); List<CacheKey> keys = new ArrayList<>(); keys.add(new SimpleCacheKey("http://test.uri")); keys.add(new SimpleCacheKey("http://tyrone.uri")); keys.add(new SimpleCacheKey("http://ian.uri")); mCacheKey = new MultiCacheKey(keys); mIsCancelled = new AtomicBoolean(false); FakeClock fakeClock = new FakeClock(); mReadPriorityExecutor = new TestExecutorService(fakeClock); mWritePriorityExecutor = new TestExecutorService(fakeClock); when(mBinaryResource.openStream()).thenReturn(mInputStream); when(mBinaryResource.size()).thenReturn(123L); when(mByteBufferFactory.newByteBuffer(same(mInputStream),eq(123))) .thenReturn(mPooledByteBuffer); mockStatic(StagingArea.class); when(StagingArea.getInstance()).thenReturn(mStagingArea); mBuffereddiskCache = new BuffereddiskCache( mFileCache,mByteBufferFactory,mPooledByteStreams,mReadPriorityExecutor,mWritePriorityExecutor,mImageCacheStatsTracker); }
private void assertConsumerReceivesImage() { ArgumentCaptor<EncodedImage> resultCaptor = ArgumentCaptor.forClass(EncodedImage.class); verify(mConsumer).onNewResult(resultCaptor.capture(),eq(Consumer.IS_LAST)); assertNotNull(resultCaptor.getValue()); assertEquals(THUMBNAIL_FILE_SIZE,resultCaptor.getValue().getSize()); verifyNoMoreInteractions(mConsumer); }
public ResizeAndRotateProducer( Executor executor,PooledByteBufferFactory pooledByteBufferFactory,boolean resizingEnabled,Producer<EncodedImage> inputProducer,boolean useDownsamplingRatio) { mExecutor = Preconditions.checkNotNull(executor); mPooledByteBufferFactory = Preconditions.checkNotNull(pooledByteBufferFactory); mResizingEnabled = resizingEnabled; mInputProducer = Preconditions.checkNotNull(inputProducer); mUseDownsamplingRatio = useDownsamplingRatio; }
public EncodedMemoryCacheProducer newEncodedMemoryCacheProducer( Producer<EncodedImage> inputProducer) { return new EncodedMemoryCacheProducer( mEncodedMemoryCache,inputProducer); }
ConvenientImagePicker iOS 简洁优雅的 imagepicker
ConvenientImagePicker 介绍
ConvenientimagePicker 精准的手势交互,简洁优雅的界面,可以弹出选择系统相册照片,或者提供制定图片。
ConvenientImagePicker 官网
https://github.com/CLOXnu/ConvenientImagePicker
我们今天的关于docker 删除镜像的时候报错 --image has dependent child images和docker删除镜像失败的分享就到这里,谢谢您的阅读,如果想了解更多关于25.week4 docker build 也就是创建自己的image 上传image到dockerhub 从dockerhub下载images、android – FragmentStatePagerAdapter with ChildFragmentManager – FragmentManagerImpl.getFragment导、com.facebook.imagepipeline.image.EncodedImage的实例源码、ConvenientImagePicker iOS 简洁优雅的 imagepicker的相关信息,可以在本站进行搜索。
本文标签: