android
文章平均质量分 73
weixin_43298955
这个作者很懒,什么都没留下…
展开
-
No original dex files found for dex location /xxx/xxx 问题解决方案
问题:基于qigsaw的api,在往Classloader中添加新的apk时(apk的位置位于内部存储 getFilesDir文件夹下),报出如下错误“No original dex files found for dex location”。原因:在将apk复制到getFilesDir()文件夹下的过程中,文件受损,导致classloader 不能正常识别出apk内的dex文件。针对较大的文件(28M),可以用下面方法下载,但是apk文件会受损,读取不出里面dex。2)、apk文件从网络中下载。原创 2022-12-15 10:25:36 · 826 阅读 · 0 评论 -
java.util.zip.ZipException: attempt to write past end of STORED entry
private def saveJarEntry(JarOutputStream jarOutputStream, File saveFile, JarEntry jarEntry) { jarOutputStream.putNextEntry(jarEntry) def inputStream = new FileInputStream(saveFile) def buffer = new byte[8192] def readSi...原创 2022-04-06 14:35:43 · 2569 阅读 · 0 评论 -
Android 自定义注解处理器
之前我们可能用过dagger、hilt之类的注解,使用这些注解可以方便我们的工作,减少我们的代码编写量。因此,本文主要是介绍如何自定义一个注解处理器。可以分为2个部分,一、定义注解和注解处理器;二、注解使用演示。本文的目标:定义一个类构造方法上的注解DemoAnnotation,并使用此注解生成一个工厂类。注解的执行结果如下图所示一、注解和注解处理器 首先我们要新建一个”Java or Kotlin Library“组件项目 ,然后 对此子项...原创 2022-02-05 15:14:34 · 2004 阅读 · 0 评论 -
Android Gradle自定义插件
一、Gradle插件介绍Android Gradle插件中,包含了一些task可以帮我们做一些编译、引入依赖、打包等工作,比如assembleBuild,clean等等。二、Gradle编写1、新建一个Android Library,命名为demo-plugin,然后删掉之前的java文件夹,并创建一个Groovy文件夹,因为,我们是使用Groovy来编写Gradle 插件的。2、将子项目的build.gralde文件,修改为如下。因为...原创 2022-02-04 20:20:12 · 2301 阅读 · 0 评论 -
Caused by: org.gradle.api.GradleException: Cannot create a proxy class for abstract class 问题处理
Caused by: org.gradle.api.GradleException: Cannot create a proxy class for abstract class 'DownLoadPluginExtension'.(自定义的插件) at org.gradle.api.internal.AbstractClassGenerator.generateUnderLock(AbstractClassGenerator.java:107) at org.gradle.api.int...原创 2021-12-23 11:41:36 · 2809 阅读 · 0 评论 -
Android studio 设置代码格式化配置文件步骤
Preference->Editor->Code Style->Scheme右侧按钮->Import Scheme原创 2021-07-17 17:36:23 · 889 阅读 · 1 评论 -
Glide笔记----加载网络图片
Glide是一个图片加载框架,使用方法如下: 添加依赖: implementation "com.github.bumptech.glide:glide:$glide_version" annotationProcessor "com.github.bumptech.glide:compiler:$glide_version" Glide版本号参考Glide地址:https://github.com/bumptech/glide 使用方式如下:Glide.wi...原创 2021-07-13 20:32:17 · 2720 阅读 · 1 评论 -
Android LiveData笔记
LiveData特性: 1、只有在活跃状态(STARTED,RESUMED)才会收到通知,非活跃状态不会收到更新通知。 2、只有在数据发生变化时才发生更新,且只发送给处于活跃状态的观察者。 3、观察者在首次从非活跃状态变为活跃状态时,会收到更新通知。若第二次从非活跃状态转为活跃状态,则只在值变化时,才会收到通知。使用注意: 1、尽量放在ViewModel中,不放在Activity或Fragment中,原因:其一、避免Activity/Fragment冗余;其二、在...原创 2021-06-26 22:52:38 · 216 阅读 · 2 评论 -
Jetpack--生命周期Lifecycle笔记
Jetpack中的Lifecycle可以让我们感知Activity或Fragment生命周期的变化,进而可以让业务代码在组件的生命周期内执行。 Lifecycle用于存储有关组件(Activity或Fragment)的生命周期状态的信息,并允许其他对象观察此状态。Lifecycle允许其他对象观察查询当前状态(通过isAtLeast方法)。 LifecycleOwner是单一方法接口,表示类具有Lifecycle,它只有一个方法getLifecycle.LifecycleObserver可以...原创 2021-05-19 19:29:31 · 376 阅读 · 0 评论 -
OkHttp3笔记---CacheInterceptor
CacheInterceptor概览 CacheInterceptor的作用为将Http的请求结果放到到缓存中,以便在下次进行相同的Http请求时,直接从缓存中读取结果,避免进行耗时的Http请求。OkHttp3使用缓存的方式如下:val client:OkHttpClient by lazy { private var file = context.externalCacheDir OkHttpClient.Builder() //缓存大小为10M .原创 2021-05-07 22:19:09 · 239 阅读 · 2 评论 -
Android DataBinding双向绑定原理
Android中的双向绑定是指:将Model设置给View之后,当Model中的数据发生改变时,View显示的内容也会随之改变;当View发生变化时,Model中的数据也会随之改变。双向绑定可以让开发者使用数据驱动视图,并且降低了程序中的耦合度。双向绑定本质是基于观察者模式实现的。在代码层面,主要表现为:当Model中的数据发生变化时,通过回调接口,通知数据绑定器重新设置View中的数据;当View中的属性发生变化时,通过监听器捕获发生的变化,并将此变化传递给Model。这样就实现了双向绑定。整体框架如..原创 2021-04-10 16:35:44 · 2481 阅读 · 1 评论 -
Android DataBinding双向绑定相关注解
目录@InverseMethod@BindingAdapter@InverseBindingAdapter@BindingMethod@InverseBindingMethod@Bindable 在了解DataBinding相关注解前,可以看下这一篇文章“注解介绍”,了解一下什么是注解及注解怎么用。@InverseMethod 此注解用于方法上,作用为转换数据。用法如下: 新建一个Binding.kt文件,并写如以下代码:@InverseMethod("i...原创 2021-04-08 17:52:49 · 535 阅读 · 0 评论 -
Android DataBinding双向绑定使用
Android双向绑定的好处就不再介绍了,直接上使用方法的代码。以下展示Demo1-3,使用方式从简到繁。双向绑定简单使用Demo1: 我们使用ObservableField与EditView展示双向绑定。使用方式如下,将此ObservableField与一个EditView进行绑定(使用@={}),当视图EditView发生文字变化时,ObservableField中数据也会随着变化。ObservableField中的数据发生变化,也会造成EditView的文字变化。因为Observable...原创 2021-04-08 11:11:45 · 554 阅读 · 1 评论 -
Picasso原理笔记
Picasso是Github上的一款很受欢迎的图片加载框架,它可以从网络、assert、本地文件等资源处加载图片,并提供了图片缓存功能。 Picasso加载图片的过程大致如下: 1、构建图片加载任务; 1.1、获取Picasso单实例。在调用Picasso的get方法时会获取一个Picasso单实例。 1.2 、构建图片加载任务。在调用Picasso的load(url)方法时,会构建一个RequestCreater,以接收对图片进行的各种处理,并以此构建一个图片加载请求(...原创 2021-04-03 11:04:13 · 215 阅读 · 0 评论 -
RecyclerView嵌套造成的滑动冲突解决方法
背景:2个同向滑动的RecyclerView相互嵌套,进行滑动时发生滑动冲突。例如,Viewpager2内部包含了另一个ViewPager2或一个横向滑动的recyclerView。这时,在横向滑动时,可能滑动的是外部ViewPager2,也可能是内部的RecyclerView。滑动冲突的原因:外部ViewPager2和内部RecyclerView的滑动阈值不同造成滑动冲突。ViewPager2的滑动阈值较高,内部RecyclerView的滑动阈值较低。具体来说,在触摸事件分发时,ViewGroup会先原创 2021-03-16 14:42:53 · 3245 阅读 · 0 评论 -
OkHttp3笔记----CallServerInterceptor
在上一篇ConnectInterceptor,介绍了Http的连接过程。本篇将介绍Http如何发送和接收数据,在OkHttp中,CallServerInterceptor用来发送和接收数据。接下来以Http2.0,介绍数据发送接收的大体过程,在Http2.0协议中,数据会被封装成数据帧进行发送。CallServerInterceptor概览: Http2Connection:表示了一个Http连接,包含了Http2Writer,其负责将数据帧发送给服务器,Http2Reader其负责接...原创 2021-03-03 23:32:03 · 474 阅读 · 1 评论 -
OkHttp3笔记---ConnectInterceptor
ConnectInterceptor的作用为建立客户端和服务端的Http连接,其中连接(RealConnection)是可以复用的(针对Http2.0协议)。获取Http连接的过程如下:首先,检查当前的RealCall是否含有可用的Http连接,若包含,则返回可以的连接。否则,检查连接池是否含有可用的连接,若有,则返回。若依然找不到可用的连接,则建立一个新的Http连接,并将其保存到连接池中。...原创 2021-03-03 11:41:27 · 352 阅读 · 0 评论 -
OkHttp3笔记---TaskRunner
TaskRunner为OkHttp中的网络通信创建线程,它使用一个线程池,创建线程用以处理OkHttp交付的网络通信任务。一、TaskRunner概览 BackEnd:网络任务的处理器,用于处理网络任务。它包含了一个线程池,此线程池的核心线程数量为0,最大线程数量为Integer.MAX_VALUE,任务队列为一个容量为0的阻塞队列。 Task:网络任务 TaskQueue:是一个任务队列,包含了多个网络任务,对网络任务进行管理 readyQueues:就...原创 2021-03-02 18:40:16 · 1068 阅读 · 0 评论 -
DiskLruCache用法及原理随笔
DiskLruCache介绍DiskLruCache是一个管理硬盘内容的存储管理工具,它采用了最近最少使用(LRU)算法,以对硬盘中存储的文件进行管理,在存储空间短缺的情况下,会优先将最近最少使用的文件删除,以扩展可用的硬盘空间。DiskLruCache架构图如下:DiskLruCache主要由如下几个部分组成:1、LRU链表lruEntries,它是一个LinkedHashMap类型的对象,而LinkedHashMap是一个LRU算法的实现类,DiskLruCache就是基于此类来管理硬盘中的文原创 2020-12-19 13:36:36 · 1370 阅读 · 1 评论 -
Could not resolve all artifacts for configuration ':classpath'.
出现的问题Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all artifacts for configuration ‘:classpath’.解决方法这句话的意思可能是不能找到classPath所指定的资源,这是我们需要对repositories进行修改。我在将dependencies修改原创 2020-05-09 10:38:02 · 3685 阅读 · 0 评论 -
Android scrollTo滑动原理分析
在这里先说一下结论,我们调用scrollTo使View内容发生移动的原因是:view的画布发生了移动;即scrollTo的调用最终会调用:canvas.translate(-mScrollX, -mScrollY)这也同时解释了为什么我们对scrollTo方法传入正值,view的内容却往左/上移动。我们先来看一下scrollTo方法:public void scrollTo(i...原创 2020-03-13 23:10:07 · 599 阅读 · 0 评论 -
findViewById结果为null
背景: 自定义了一个View,运行时可以显示出来,但是在Activity中调用findViewById的结果却为null。定义View代码:class BView (context: Context?) : View(context) { constructor(context:Context?,attr: AttributeSet?):this(context){ ...原创 2019-02-19 08:39:27 · 301 阅读 · 0 评论 -
android点击事件原理分析(一)
写在前面 最近需要回放一些点击事件,但是时不时会回放失败(很尴尬的Bug),所以去看了一下点击事件的传递流程,这一篇文章主要讲一下点击事件是如何在ViewGroup中传递的。这是一个对理解点击事件传递很有帮助的文章,关于MotionEvent的。 从网上查找资料,可以得知,点击事件TouchEvent会经过一系列的传递,传到ViewGroup中的dispatchTouchEv...原创 2018-12-02 20:55:18 · 1789 阅读 · 0 评论 -
System UI has stoped
问题分析:可能会有不同bug导致这个问题,需要在打印出的错误日志中查看是什么问题;我的是:解决方案:经查看是以下造成的:setSmallIcon(R.mipmap.ic_launcher)改为setSmallIcon(R.drawable.ic_launcher_background) ...原创 2018-10-16 09:42:02 · 780 阅读 · 0 评论 -
android studio安装完后,打开提示failed to load jvm dll
问题分析:之前安装了jdk10,并且配置好了环境,可以通过cmd命令行查看版本,但打开Android studio时提示不能加载JVM,可能原因,版本兼容。解决:卸载jdk10,安装jdk1.8。再次打开Android studio时可以正常显示。...原创 2018-10-13 11:16:22 · 6678 阅读 · 1 评论