自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(298)
  • 资源 (11)
  • 论坛 (1)
  • 收藏
  • 关注

原创 基于ViewPager实现大量图片浏览功能

1.      了解一下ViewPager的执行原理,写的很详细可参考http://blog.csdn.net/ddtou/article/details/212448792.      ViewPager浏览大量图片时导致内存溢出在了解ViewPager原理之后,说一下浏览大量图片是产生内存溢出的原因,了解一下每次移动下一页要返回的View的方法首先看一下初始化新视图@Ove

2014-09-22 11:57:51 1806

原创 Java各种类的区别(类,内部类)补充--面试整理二

1.类的修饰符1.1.finalNormalClass.javapublic final class NormalClass{ private int x = 10; public int getX() { return x; } public void setX(int x) { this.x = x; }}class NormalClass1 extends NormalClass{ }The type NormalClass1 cannot subcla

2021-02-17 14:07:39 36

原创 Java各种类的区别(类,内部类)--面试整理二

以下我将陆续写一些近一个月面试的记录,欢迎大家拍砖讨论;1.类是什么?类是一个模版,它描述一个类对象的行为和状态。现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑:(状态和行为的用途)软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。通过上图创建一个简单的类

2021-02-17 13:12:48 87

转载 面试官:“Handler的runWithScissors()了解吗?为什么Google不让开发者用?“

一、序runWithScissors()是 Handler 的一个方法,被标记为 @hide,不允许普通开发者调用。这个方法算是比较冷门,如果面试中被问及,面试者不知道时,通常面试官会换个问法:"如何在子线程通过 Handler 向主线程发送一个任务,并等主线程处理此任务后,再继续执行?"。这个场景,就可以借助runWithScissors()来实现。虽然该方法被标记为 @hide,但是在 Framework 中,也有不少场景使用到它。不过它也有一些隐患,正是因为这些隐患,让 Androi...

2021-02-16 19:03:01 22 1

转载 每日一字节跳动面试真题:说一下RecyclerView 性能优化

字节跳动四面有三面都问了这个问题,在此做了整理,希望可以帮助到大家,欢迎查漏补缺。数据处理和视图加载分离我们知道,从远端拉取数据肯定是要放在异步的,在我们拉取下来数据之后可能就匆匆把数据丢给了 VH 处理,其实,数据的处理逻辑我们也应该放在异步处理,这样 Adapter 在 notify change 后,ViewHolder 就可以简单无压力地做数据与视图的绑定逻辑,比如:mTextView.setText(Html.fromHtml(data).toString())这里的 Html

2020-12-24 20:11:33 51 1

转载 RecyclerView配合DiffUtil,数据对比,局部刷新

本文转载自作者: 承香墨影,附上作者微信和公众号一、前言DIffUtils 是 Support-v7:24:2.0 中,更新的工具类。因为已经更新了一段时间了,也不好说是最新更新的。它主要是为了配合RecyclerView 使用,通过比对新、旧两个数据集的差异,生成旧数据到新数据的最小变动,然后对有变动的数据项,进行局部刷新。接下来就 DiffUtil 的使用细节,进行一个详细的讲解,希望一篇文章就完全理解 DiffUtil。二、为什么会有DiffUtilRecyclerView

2020-12-24 19:58:37 40 1

转载 Fragment切换replace和(add-hide-show)

本所有的app都会涉及到。在Fragment的切换中有两种方式----方式1使用replace直接切换;方式2使用add先添加Fragment,然后再使用hide隐藏不显示的Fragment,最后再用show将需要显示的Fragment显示出来。 下面将介绍下这两种方式:方式1:使用replace使用replace切换Fragment的代码如下:FragmentManager fm = getSupportFragmentManager();FragmentTrans...

2020-12-22 08:17:35 20

转载 主线程中的Looper.loop()死循环为什么不会导致ANR?

源码的 ActivityThread 类中有这么一段代码:public final class ActivityThread { public static void main(String[] args) { ... Looper.prepareMainLooper(); // 注意此处 ActivityThread thread = new ActivityThread(); thread.attach(fa

2020-12-22 08:08:12 32

原创 面试之Android事件传递

以上是测试结构;firstl = this.findViewById(R.id.firstlinearLayout); secl = this.findViewById(R.id.seclinearLayout); testtv = this.findViewById(R.id.textView); firstl.setOnTouchListener(new View.OnTouchListener() { @Overri...

2020-12-21 23:24:23 51 1

转载 Android Handler究竟是如何实现跨线程的?

背景本文要解决的问题是:1、Handler究竟是怎样实现跨线程通信的?2、为什么要使用ThreadLocal?为什么还要写这么一篇文章呢?网上关于Handler机制的文章已经多如牛毛,但是大多数源码分析都是在分析Looper、MessageQueue、Message之类的,看了之后还是不知道,或者不会去想,Handler究竟是如何做到跨线程的。有的也会讲ThreadLocalMap,个人理解,它不是做到跨线程的原因,它只是对于Handler机制的一种优化。阅读本文需要先对Handler机制有一定了

2020-12-19 09:45:38 49 1

转载 Android性能优化(五)之细说Bitmap

在上一篇《Android性能优化(四)之内存优化实战》中谈到那个内存中的大胖子Bitmap,Bitmap对内存的影响极大。 例如:使用Pixel手机拍摄4048x3036像素(1200W)的照片,如果按ARGB_8888来显示的话,需要48MB的内存空间(4048*3036*4 bytes),这么大的内存消耗极易引发OOM。本篇文章就来说一说这个大胖子。1. Bitmap内存模型Android Bitmap内存的管理随着系统的版本迭代也有演进:1.在Android 2.2(API8)之前,当G

2020-12-16 21:53:32 37

原创 Lifecycle、LiveData、ViewModel讲解之ViewModel

Lifecycle、LiveData、ViewModel介绍在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 运作方式的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄露甚至应用崩溃。ViewModelViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。ViewModel产生的原因Android 框架可以管理界面控制器(

2020-11-13 17:58:16 37

原创 Lifecycle、LiveData、ViewModel讲解之LiveData

Lifecycle、LiveData、ViewModel介绍在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 运作方式的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄露甚至应用崩溃。LiveDataLiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知.

2020-11-11 18:03:34 45

原创 Lifecycle、LiveData、ViewModel讲解之Lifecycle

Lifecycle、LiveData、ViewModel介绍在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 运作方式的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄露甚至应用崩溃。Lifecycle(Lifecycle)生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。a.

2020-11-09 17:05:19 93

原创 AndroidX是什么?

为什么会有AndroidX和android.support.*支持库?在开发支持多个 API 版本的应用时,您可能需要一种标准的方法,以便对早期版本的 Android 系统提供新功能,或者优雅地回退到等效的功能。您可以利用这些库提供相应的兼容性层,而无需编译代码来处理早期版本的平台。此外,支持库还提供标准 Framework API 中未提供的额外的工具类和功能,使您能更轻松地面向更多设备进行开发和提供支持。Android 支持库最初是适用于各种应用的单个二进制库,如今它已经发展为一套用于应用开发的

2020-11-04 18:44:50 89 1

转载 TCP和UDP的区别和优缺点

1、TCP与UDP区别总结:1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。4....

2020-10-26 18:44:43 79

转载 java常用设计模式总结

设计模式详细讲解推荐阅读 :https://refactoringguru.cn/design-patterns/structural-patterns掌握常用的几种(最起码单例模式、工厂模式),了解其他的设计模式即可,做到手里有粮,心里不慌。首先,掌握每种模式的定义及使用场景。其次,掌握一个形象的例子,简单的过一遍代码。学习设计模式的真正目的:编程时,有意识地面向接口编程,多用封装、继承、组合、多态等OOP思想,而不仅仅是死记几类设计模式。常用的设计模式分类:创建型(创建一个对象):单例模式、..

2020-10-21 18:40:22 19

原创 网络编程-BIO和NIO的理解

1.BIO和NIO简介BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善;NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送连接请求都会注册到多路复用器上,多路复用器轮训到连接有I/O请求时才启动一个线程进行处理;AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器

2020-09-28 18:04:44 76

转载 如何做一个软件项目经理? ----写给公司所有的开发人员

第一部分:软件项目经理的要求首先是一个管理者,其次熟悉某些工具,某几种语言,行业背景,项目管理技能。软件项目经理面临的恶劣环境,我们绝大部分软件企业运行在相对混乱的状态(CMM一级),组织不大可能对项目以及项目经理的责任做出明确、合适的界定,所以,影响项目成功的一切因素都是项目经理的责任,包括客户、环境、考核、激励等等。一、责任心。取得项目的成功无疑是项目经理的责任。项目经理只有把客户的满意和企业长期利益作为自己的责任,项目成功才有可靠的基础,对于公司的战略性项目尤其如此。二、常识和直觉。大

2020-09-03 15:41:12 154

原创 https实现原理(SSL认证过程)

目录1.https验证原理1.1原理图1.2https建立连接过程1.2.1 客户端访问https连接1.2.2 - 1.2.3 服务端发送证书(公钥)给客户端1.2.4- 1.2.5 客户端验证服务端的证书1.2.6 - 1.2.7 服务端接收加密信息,解密得到客户端提供的随机字符串1.2.8 客户端验证服务端返回的握手信息,完成握手1.3 验证总结2.SSL请求完整过程示例3.客户端验证证书的合法性Http协议由于 HTTP 协议在通信过程中,是基于明

2020-09-03 10:15:43 290

原创 HTTP1.0和HTTP1.1的区别及轮询、长轮询、长连接、websocket

目录1.HTTP1.0和HTTP1.1的区别1.1.HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理1.2.HTTP 1.1增加host字段1.3.100(Continue) Status(节约带宽)1.4.Chunked transfer-coding1.5.cache2.Web端即时通讯技术2.1轮询2.2长轮询(comet)2.3长连接(SSE)2.4WebSocket2.5四种Web.

2020-09-01 18:15:41 80

转载 ConcurrentHashMap 1.7和1.8区别

ConcurrentHashMap 与HashMap和Hashtable 最大的不同在于:put和 get 两次Hash到达指定的HashEntry,第一次hash到达Segment,第二次到达Segment里面的Entry,然后在遍历entry链表(1) 从1.7到1.8版本,由于HashEntry从链表 变成了红黑树所以 concurrentHashMap的时间复杂度从O(n)到O(log(n))(2) HashEntry最小的容量为2(3)Segment的初始化容量是16;(4)Ha.

2020-08-10 15:20:18 102

原创 Java集合类实现整理及Concurrent并发包整理总结(CAS,AQS)

目录​1.集合包1.1 ArrayList1.2 LinkedList1.3 Vector1.4 Stack1.5 HashSet1.6 TreeSet1.7HashMap1.8 TreeMap2.并发包2.1ConcurrentHashMap2.2 ReentrantLock2.3 Condition2.4 CopyOnWriteArrayList2.5 CopyOnWriteArraySet2.6 ArrayBlockingQueu..

2020-08-05 16:18:26 79

原创 CAS(乐观锁)与AtomicInteger原理

目录1.什么是锁?2.悲观锁3.乐观锁4.Java实现CAS操作5.实现无阻塞多线程争抢资源的模型实例6.CAS缺点7.java.util.concurrent包介绍1.什么是锁?什么是锁,编程中我们提到锁通常是指并发资源锁。那么啥是资源锁,我们通俗地理解加锁行为,当一个资源被两个程序(进程)争夺时,为了保证资源只能够被其中一方使用,因此在获取资源后给其加锁,使用期间不让其他进程获得的过程。2.悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所.

2020-07-31 20:21:26 68

原创 JVM虚拟机-虚拟机栈帧栈结构

1.虚拟机栈(VM Stack)结构图2.虚拟机栈帧栈是什么?虚拟机用来进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。3.栈帧的组成栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。第一个方法从调用开始到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息。在编译代码的时候,栈帧中需要多大...

2020-07-21 14:27:45 185

原创 多线程并发原子性,可见性,有序性分析

多线程的三个特性:a.原子性是指一个操作是不可中断,即使多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰;简单看几个例子:1)int x=10; 2)int y=x; 3)x++; 4.x=x+1;这上面四个语句,区分哪些是原子操作,哪些非原子操作?1)第一句,直接把10赋值给x的工作内存,这个操作是不可再分的,并且很直接,这就是原子操作;2)第二句,先读取x的值,然后将x的值写入到y的工作内存,这个可分割,并且不直接,这就不是原子操作 ;3)第三句,其实和第.

2020-07-14 16:49:02 111

翻译 内存分析工具LeakCanary是如何工作的

一旦LeakCanary被安装,它自动检测和报告内存泄漏,分4步:检测保留下来的对象; 导出堆信息; 分析堆信息; 对内存泄漏进行分类;目录1.检测保留下来的对象2.导出堆文件3.分析堆文件4.对内存泄漏进行分类5.其他1.检测保留下来的对象LeakCanary通过Hook(劫持)Android生命周期去自动检测内存泄漏问题,当Activity和Fragment被销毁并且执行垃圾回收的时候;这些被销毁的对象被传递给ObjectWatcher(持有这些销毁的对象的.

2020-06-27 16:33:03 564

原创 内存分析工具之LeakCanary2.4使用整理

目录1.LeakCanary是什么?2.LeakCanary有什么优点?3.LeakCanary如何引入到项目中?3.1引入leakcanary-android依赖3.2确认LeakCanary是否运行3.3LeakCanary自动检测以下对象的泄漏4.LeakCanary如何分析内存泄漏?4.1测试内存泄漏用例4.2复杂的内存泄漏通过分析hprof文件1.LeakCanary是什么?LeakCanary是一个为了Android使用的内存检测分析工具;2.

2020-06-26 21:43:20 1915

原创 Android常见内存泄漏原因和解决办法

推荐阅读(了解Java虚拟机的原理,垃圾回收算法,堆和栈的区别) :Java虚拟机JVM整理https://blog.csdn.net/ahou2468/article/details/105313444Java中的堆和栈的区别https://blog.csdn.net/ahou2468/article/details/106188635Java对象引用的类型(强引用,软引用,弱引用,虚引用)什么是内存泄漏?在Android开发过程中,当一个对象已经不需要再使用了,本该被回收

2020-06-26 12:55:33 355

原创 Android实现无痕埋点具体实现-采用代码插桩的方式

目录1.View.AccessibilityDelegate1.1先看下为什么采用View.AccessibilityDelegate方式,通过View源码如何执行点击事件:1.2完成替换View中AccessibilityDelegate类,实现sendAccessibilityEvent(this, eventType)方法2.gradle插件字节码插装2.1Android下apk编译流程2.2编写gradle插件模块(groovy文件实现)2.2.1工程下新建buildSr

2020-06-18 16:09:48 449

原创 Android实现无痕埋点方案(View操作的事件统计和Activity与Fragment页面的数据收集)

目录1.埋点是什么?2.为什么需要无痕埋点?3.自动无痕实现方案?3.1如何准备识别每个View?3.1.1如何定位是那个视图?3.1.2保证View的ID不受Android版本影响3.1.2尽量保证ViewGroup下新插入视图时View的ViewTree路径下的同一层级下index不变(如何保证?)3.2代码实现View获取ViewTree路径(唯一ID)3.2.1获取Activity名字-所属页面3.2.2获取View所属Fragment页面3.2.3.

2020-06-15 22:40:46 835

原创 Android开发自定义Gradle插件

目录1.在自己的module(例如:app)中build.gradle中定义插件2.创建当前项目的插件3.创建通用插件,发布到maven3.1.创建module3.2利用mavenDeployer发布插件3.3定义plugin应用在android studio中gradle作为主要的构建工具,其核心工作任务在于执行一系列的Task,而plugin在gradle构建过程又扮演着举足轻重的角色,有时为了完成相应的构建任务必须通过引入相应的插件来辅助,这些插件中定义了构建Projec.

2020-06-11 10:50:50 285

原创 Android通过Hook技术实现一键换肤

实现换肤的方案:a.静态修改theme主题方式设置多套皮肤的theme;styles.xml<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <it

2020-06-06 00:02:49 347

原创 Android之Hook入门讲解

目录1.Hook是做什么的?(解决什么问题?)2.HOOK技术如何改变API执行结果的?3.使用Hook技术需要有实现Java反射和阅读源码的能力3.1Java反射3.2SDK源码4.Hook实现的通用思路5.Hook拦截点击事件加入统计点击次数5.1确认需要hook操作对象OnClickListener实现的实例5.2获取要hook干涉执行逻辑的拥有者(ListenerInfo对象);5.3创建(hook对象)OnClickListener类实例代理类,在代理.

2020-06-03 12:24:28 221

原创 JDK1.8HashMap源码分析说明

目录1.HashMap数据存储结构​2.HashMap成员变量3.HashMap构造方法4.HashMap数据操作4.1put(key,value)4.2get(key)5.get()和put()方法的辅助操作5.1resize()5.2treeifyBin()6.get()和put()方法的辅助类6.1Node6.2KeySet6.3Values6.4EntrySet6.5KeyIterator,ValueIterator,EntryIterat

2020-05-30 17:42:20 157

转载 Java中的堆和栈的区别

当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先出(Last In First Out)的顺序的数据结构,这就是java.util.Stack。这种情况下,不免让很多人更加费解前面的问题。事实上,堆和栈都是内存中的一部分,有着不同的作用,而且一个程序需要在这片区域上分配内存。众所周知,所有的Java程序都运行在JVM虚拟机内部,我们这里介绍的自然是JVM(虚

2020-05-18 11:09:11 93

原创 HTTP协议,HTTP请求和响应,TCP三次和四次握手

1.HTTP协议是什么?2.HTTP请求和响应2.1HTTP请求2.2HTTP响应2.3HTTP请求和响应流程3.TCP三次握手和四次握手4.HTTP七层协议

2020-05-18 10:47:35 520

原创 EditText-Android实现图文混排

目录1.Span样式介绍1.1Span类继承关系1.2StyleSpan1.3AbsoluteSizeSpan1.4ForegroundColorSpan1.5UnderlineSpan1.6StrikethroughSpan1.7Spanned2.实现富文本编辑2.1定义富文本样式类2.2生成选中文字要设置的Span(样式)2.3应用样式到选中文字...

2020-04-27 14:32:14 426

原创 Java常见数据结构整理(数组,栈,队列,链表,红黑树)二

1.链表2.树

2020-04-14 20:41:47 170

原创 Java常见数据结构整理(数组,栈,队列,链表,红黑树)一

1.数组数组是最简单、也是使用最广泛的数据结构。栈、队列等其他数据结构均由数组演变而来。下图是一个包含元素(1,2,3和4)的简单数组,数组长度为4。每个数据元素都关联一个正数值,我们称之为索引,它表明数组中每个元素所在的位置。大部分语言将初始索引定义为零。数组分为两种类型:一维数组,多维数组;1.1数组基本操作1)Insert——在指定索引位置插入一个元素2)Get——返...

2020-04-07 21:15:49 179

android Wi-Fi扫描连接测试代码

android中Wi-Fi,扫描,连接测试代码,适配6.0及以上扫描不到Wi-Fi列表的情况;

2018-05-08

CAN总线.pdf

汽车CAN总线通信规则说明,只定义数据通信规则,开发只需要按照相应的规则处理CAN数据即可,与开发语言无关;

2019-07-24

I-Jetty相关jar包

I-Jetty从官网下载下来以后不能直接运行,需要自己添加相关的jar包引用;

2018-06-26

StackNavigator示例

StackNavigator示例代码,可以参考https://blog.csdn.net/ahou2468/article/details/87625428

2019-02-26

Android-I-Jetty服务器

Android-I-Jetty服务器源码,项目相关内容已经整理完成,拿来就可以运行了,希望对您有一定帮助

2018-06-26

Maven+Spring+SpringMVC+Mybatis+Shiro框架搭建工程

仅仅是一个Spring+SpringMVC+Mybatis+Shiro框架搭建工程,应该下载下来即用,对于初学者不会搭建的应该有用,相关配置查看配置文件即可,有详细说明。

2018-02-04

Android-I-Jetty服务器部署例子代码

Android-I-Jetty服务器部署例子代码,第一运行起来I-Jetty服务器以后,一定想要例子测试一下;

2018-06-26

Android关系数据库库lite-orm

Android关系数据库库lite-orm,支持sqlite关系型数据库,方便开发人员实现对象与数据库表的转换,减少开发难度

2018-04-11

spring-jdbc源码

Spring-jdbc源码,方便调试

2017-06-05

Android开发的五子棋游戏

用Android开发五子棋游戏是在Android2.2版本下开发的,主要实现了人人对战功能。

2010-08-01

初级程序员考试辅导书(PDG)

这是一本初级程序员教程希望和大家分享啊!

2009-05-27

mayundoyouknow的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除