自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

https://juejin.cn/user/1654096907477549/posts

要么出击,要么出局,命运女神总会眷顾拼尽全力的一方。

  • 博客(88)
  • 收藏
  • 关注

原创 大型Android项目架构:基于组件化+模块化+Kotlin+协程+Flow+Retrofit+Jetpack+MVVM架构实现WanAndroid客户端

前言:苟有恒,何必三更眠五更起;最无益,莫过一日曝十日寒。项目采用 Kotlin 语言,Android Jetpack,组件化,模块化拆分,加入短视频功能,Flow冷流的使...

2023-04-20 23:34:40 3462 2

原创 (建议精读)学习之力 — 提高学习效率99%的灵魂秘籍!

前言:哪有什么天生如此,只是我们天天坚持。要想提高学习效率,就得有良好的学习方法,做起事情来更能事半功倍。一、努力的心态努力既能成就事业,也能成就更好的自己,人与人之间的差距主要在于能否坚持不懈地努力。艰苦的环境最有可能让我们受益良多。无论什么时候,努力的人总是超越自认为聪明的人。因为坚信——只要够努力,就能变得更好。以大多数人的努力程度之低,根本轮不到拼天赋。根据当前神经学科的研究表明,大脑具有想当大的可塑性,因此后天的努力对人的改造作用是相当惊人的。我们在不断学习和思考的过程中,大脑内部会..

2021-01-04 22:21:44 1865 4

原创 Retrofit2 详解和使用(一)

前言:要么出击,要么出局,命运女神总会眷顾拼尽全力的一方。一、概述1、什么是retrofit retrofit是现在比较流行的网络请求框架,可以理解为okhttp的加强版,底层封装了Okhttp。准确来说,Retrofit是一个RESTful的http网络请求框架的封装。因为网络请求工作本质上是由okhttp来完成,而Retrofit负责网络请求接口的封装。本质过...

2019-05-30 19:06:30 69243 27

原创 深入研究Android启动速度优化(上)- 看完这些启动优化已经完成80%了

生活不止眼前的苟且,还有诗和远方。前言用户如果想打开一个应用,就一定要经过。用户如果想打开一个应用,就一定要经过**启动**这个步骤。APP启动时间的长短,不只是用户体验的问题,对于淘宝、京东等大型APP来说,会直接影响用户的**留存和转化**等核心数据。对研发人员来说,启动速度是我们的**门面**,它清清楚楚可以被所有人看到,我们都希望自己应用的启动速度可以秒杀所有竞争对手。

2024-04-07 14:47:18 964 1

原创 ViewBinding与DataBinding(视图绑定与数据双向绑定)

前言:心中纵是有所盼 严寒没有减 风很冷 我的手已渐蓝 前言 控件查找对于Android开发来说也是一部血泪史,一直为更有效的方案进行了多种方案的研究和探讨。`findViewById()` 过于繁琐,强制转换不安全;`butterkniife` 会存在众多臃肿的全局

2023-12-19 22:24:50 1256

原创 关于LiveData全面详解(附事件总线)

前言:缤纷色彩闪出的美丽 是因它没有 分开每种色彩 LiveData 组件是 Jetpack 新推出的基于观察者的消息订阅/分发组件,具有宿主(Activity/Fragment)生命周期感知能力。这种感知能力可确保 LiveData 仅分发消息给与活跃状态的观察者,即只有处于活跃状态的观察者才能收到消息。LiveData 的消息分发机制,是以往 Handler,EventBus,RxjavaBus 无法比拟的,

2023-07-03 08:00:00 486

原创 ViewModel进阶 | 使用SavedState实现数据复用的另一种方式

金风玉露一相逢,便胜人间无数。前言本文需要有上一篇文章基础,如果不了解的可以先看看《由浅入深,ViewModel配置变更的复用详解》前面我们了解到,ViewModel 它只能做到。

2023-06-25 08:10:42 583

原创 由浅入深,详解ViewModel那些事

今年的龙舟雨来了,一场接一场,雨量很大。前言 以往如果需要在 `Activity` 或者 `Fragment` 中保存数据状态则需要重写**onSaveInstanceState ,使用bundle去存储相应的数据和状态**,但是这也只能保存轻量简单的序列化数据。而 `ViewModel` 可以做到在配置变更后依然持有状态。

2023-06-19 12:55:29 1726

原创 Android架构灵魂组件Lifecycle的生命周期机制详解

前言:写作就跟生活一样,是一趟发现之旅。Lifecycle是一个具备宿主生命周期感知能力的组件。它持有组件(Activity/Fragment)生命周期状态信息,并且允许其观察者监听宿主生命周期状态变化。一、Lifecycle的使用在使用Lifecycle观察宿主状态有三种实现方式。

2023-06-12 13:12:16 1184 1

原创 【见微知著】Android Jetpack - Navigation的架构设计

前言:人总是理所当然的忘记,是谁风里雨里,一直默默的守护在原地。`Navigation` 作为 Android Jetpack 组件库中的一员,是一个通用的页面导航框架。为**单 Activity** 架构而生的端内路由导航,用来管理 `Fragment` 的切换,并且可以通过可视化的方式,看见 App 的交互流程。今天主要来分析 `Navigation` 的简单用法和内部原理。

2023-06-07 07:11:49 1030

原创 Kotlin协程:挂起与恢复原理逆向刨析

前言:只有在那崎岖的小路上不畏艰险奋勇攀登的人,才有希望达到光辉的顶点。经过前面两篇协程的学习,我相信大家对协程的使用已经非常熟悉了。本着知其然更要知其之所以然的心态,很想知道它里面是怎么可以让异步代码同步化的?协程它是如何实现线程的调度的?协程的挂起和恢复本质是什么?今天在这里一一为大家解答。整个Kotlin 协程学习分为三部曲,本文是第三篇:Kotlin 协程实战进阶(一、筑基篇)Kotlin 协程实战进阶(二、进阶篇)Kotlin 协程实战进阶(三、原理篇)(本文需要前面两篇文章协程的知识点作为基础)

2022-09-15 21:49:32 1485

原创 Kotlin 协程实战进阶(二、进阶篇:协程的取消、异常处理、Channel、Flow)

前言上一篇文章对协程的概念和原理、协程框架的基础使用、挂起函数以及挂起与恢复等做了详细的分析,如果您对协程有一定的理解,可以阅读《Kotlin 协程实战进阶(一、筑基篇)》我们来对协程整体认识来做一个整体的交流。由于篇幅原因还有一部分重要的知识点没有讲解到,接下来继续分析 Kotlin 协程的重要要素和使用,首先来回顾一下上篇文章的整体内容:1、Coroutine:协程的概念和原理:协程是什么以及它的作用和特点,图解分析协程的工作原理。2、Coroutine builders:协程的构建,协程构建器

2021-08-05 18:04:19 4415 6

原创 一文看透 Kotlin 协程本质

前言公司开启新项目了,想着准备亮一手 Kotlin 协程应用到项目中去,之前有对 Kotlin 协程的知识进行一定量的学习,以为自己理解协程了,结果……实在拿不出手!为了更好的加深记忆和理解,更全面系统深入地学习 Kotlin 协程的知识,协程将分为三部分来讲解,本文是第一篇:Kotlin 协程实战进阶(基础篇)Kotlin 协程实战进阶(进阶篇)Kotlin 协程实战进阶(高级篇)本文大纲 一、概述协程的概念在1958年就开始出现(比线程还早), 目前很多语言开始原生支, Java

2021-07-26 12:32:20 4757

原创 Kotlin专题「二十五」:反射

前言:不要在夕阳西下时幻想,要在旭日东升时努力。一、概述  反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有方法和属性;对于任意一个对象,都能调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制当在 Kotlin 中使用反射时,你可能会使用到两种不同的反射 API。第一种是标准的 **Java 反射**,定义在包 **java.lang.reflect** 中,因为 Kotlin 类会被编译成普通的 Java 字节码,Java 反射 AP

2021-02-22 11:59:28 1639 11

原创 Kotlin专题「二十四」:注解

前言:知人者智,自知者明;胜人者力,自胜者强。   ——《道德经》一、概述Java 中的泛型  在 Java 中,其实所谓的泛型就是类型的参数化。如果方法有入参,那么这些入参面前往往会有类型,这个类型就是修饰参数所用。假如我们在创建类型的时候,也为其指定了参数,这个参数又是个类型,这种我们就称为泛型。 public void addList(Collection<T> list) {//T表示可传入任何类型表示 //TODO }使用泛型能够像传递参数..

2021-01-19 18:59:38 753 2

原创 Kotlin专题「二十三」:引用详解 :: (类引用、属性引用、函数引用、绑定引用)

前言:没有谁的幸运,凭空而来,只有当你足够努力,你才会足够幸运。这世界不会辜负每一份努力和坚持,时光不会怠慢执着而勇敢的每一个人!一、概述  反射是一组语言和库特性,允许在允许时对自己程序进行自省。Kotlin 使函数和属性成为该语言的一级公民,而内省它们(即在运行时学习属性或函数的名称或类型)与简单地使用函数或响应式风格紧密相连。在 JavaScript 平台上,目前只支持类引用。更多信息请了解 Kotlin/JS 的反射。JVM 依赖在 JVM 平台上,使用反射特性所需要的运行组件在 K..

2021-01-13 14:19:11 3130

原创 Kotlin专题「二十二」:Lambdas和高阶函数详解

前言:成功的信念在人脑中的作用就如闹钟,会在你需要时将你唤醒。一、概述 今天我们来聊下 lambda 表达式。lambda 表达式应该都不陌生,在 Java8 中引入一个很重要的特性,将开发者从原来繁琐的语法中解放出来,但是局限于只有 Java8 版本才能使用。而 Kotlin 弥补了这一问题,Kotlin 中的 lambda 表达式与 Java 混合编程可以支持 Java8 版本一下的版本。### 为什么使用 Kotlin 的 Lambda 表达式针对 Kotlin 中使用 lam

2020-12-09 19:18:30 642

原创 Kotlin专题「二十一」:委托和委托属性详解

前言:遇到困难时不要抱怨,既然改变不了过去,那么就努力改变未来。一、概述  有一些常见的属性类型,尽管我们可以在每次需要时手动实现它们,但最好是一次性实现放入库中。比如:延迟属性:值只在第一次访问时计算;观察属性:监听器会得到这个属性变化的通知;在映射中存储属性,而不是为每个属性存储单独的字段。为了涵盖这些情况,Kotlin 支持委托属性:class School { var str: String by Delegate()}语法是val/var <proper..

2020-11-25 15:44:11 979 1

原创 Kotlin专题「二十」:内联类(Inline classes)

前言:生活不是等暴风雨过去,而是学会在风雨中跳舞。一、概述有时候,业务逻辑需要围绕某种类型创建包装器。但是,由于额外的堆分配,它引入了运行时开销。此外,如果被包装的类型是原语类型,性能损失会很严重,因为原语类型通常由运行时进行了大量优化,而它们的包装器没有得到任何特殊处理。为了解决这些问题,Kotlin 引入了一种特殊的类,叫做内联类,它是通过在类名前放置一个 Inline 修饰符来声明的:inline class Password(val value: String)内联类必须在主构造函..

2020-10-23 17:27:09 1612

原创 Kotlin专题「十九」:类型别名(type alias)

前言:越努力,越幸运,若是不幸运,就一定是不够努力。一、概述  类型别名为现有类型提供了替代名称。如果类型名称太长,可以引入一个不同的较短名称并使用新的名称。interface RestaurantPatron { fun makeReservation(restaurant: Organization<(String, Int?) -> String>) fun visit(restaurant: Organization<(String, Int?) -> String>

2020-10-21 17:00:17 1816 1

原创 Kotlin专题「十八」:object(对象表达式和对象声明)

前言:现实会告诉你,不努力就会被生活踩死,无需找什么借口,一无所有就是拼的理由。一、概述  有时候我们需要创建一个对某些类稍加修改的对象,而不必显式地成为它声明一个新的子类。Kotlin 用对象表达式和对象声明来处理这种情况。使用 object 关键字能实现类似 Java 中的匿名内部类功能。Kotlin 提供 object 关键字的用意就是,在生成在一个对当前类进行轻微修改的类对象,且不需要声明一个新的子类的时候使用。下面将从 object 作为表达式和作为声明两部分阐述一下 object 的..

2020-10-14 18:33:53 1336

原创 Kotlin专题「十七」:枚举类(enum class)

前言:前行的路,不怕万人阻挡,只怕自己投降,人生的帆,不怕狂风巨浪,只怕自己没胆量。一、概述枚举类最基本的用法是实现类型安全的。枚举类使用 enum 关键字修饰: enum class Direction {//使用 enum 关键字修饰,在类头 class 前 NORTH, SOUTH, WEST, EAST }每一个枚举常数都是一个对象,枚举常量用逗号分隔。 fun test() { Direction.NORTH Directi..

2020-10-13 11:56:02 2590

原创 Kotlin专题「十六」:嵌套和内部类

前言:努力想要得到什么东西,其实只要沉着冷静、实事求是,就可以轻易地、神不知鬼不觉地达到目的。而如果过于使劲,闹得太凶,太幼稚,太没有经验,就哭啊,抓啊,拉啊,像一个小孩扯桌布,结果却是一无所获。只不过把桌子上的好东西都扯在地上,永远也得不到了。一、嵌套类类可以嵌套在其他类: class Outer { private val number: Int = 1 class Nested { fun foo() = 2 ..

2020-09-29 15:53:50 268 2

原创 Java 中的泛型以及协变和逆变(PECS法则)

前言:知人者智,自知者明;胜人者力,自胜者强。   ——《道德经》一、概述在 Java 中,其实所谓的泛型就是类型的参数化。如果方法有入参,那么这些入参面前往往会有类型,这个类型就是修饰参数所用。假如我们在创建类型的时候,也为其指定了参数,这个参数又是个类型,这种我们就称为泛型。```java public void addList(Collection<T> list) {//T表示可传入任何类型表示 //TODO }```使用泛型能够像传递参数一样传递类型,同

2020-09-15 15:09:34 1950

原创 Kotlin专题「十五」:泛型

前言:彪悍的人生,不需要解释,只要你按时达到目的地,很少有人在乎你开的是奔驰还是拖拉机。一、概述  在 Java 中,其实所谓的泛型就是类型的参数化。如果方法有入参,那么这些入参面前往往会有类型,这个类型就是修饰参数所用。假如我们在创建类型的时候,也为其指定了参数,这个参数又是个类型,这种我们就称为泛型。本篇中会涉及到 Java 的泛型以及PECS法则,有不了解的先看看[<font color="2E98F5">Java 中的泛型以及PECS法则(协变和逆变)](https

2020-09-09 15:31:52 396

原创 Kotlin专题「十四」:密封类(Sealed Classes)

前言:每一个你不满意的将来,都有一个你没有努力的曾经。一、概述  密封类用于表示受限制的类层次结构,类中的值可以拥有受限集合中的一种类型,但不能拥有任何其他类型时。从某种意义上看,他们是枚举类的拓展:枚举类型的值集合也受到限制,但每个枚举常量仅作为单个实例存在,而一个密封类的子类可以有多个可以包含状态的实例。通俗点来说,密封类是包含了一组受限的类集合,因为里面的类都是继承自这个密封类的。但是它和其他继承类(open)的区别在于密封类可以不被此文件外被继承,能有效保护代码。但是密封类的子类的扩..

2020-08-21 19:24:40 1938

原创 Kotlin专题「十三」:数据类(Data Classes)

前言:过程会苦,但结果怡人。一、概述  我们经常创建主要用于保存数据的类。在这样的类中,一些标准的功能和实用函数通常是机械地从数据推导出来的。在 Kotiln 中,这被称为一个数据类,并使用 data 修饰。...

2020-08-19 19:27:32 2130

原创 Kotlin专题「十二」:扩展Extensions(扩展函数与属性)

前言:别让欲望泯灭了希望。一、概述  Kotlin 提供了拓展具有新功能的类的能力,而不必从类继承或使用设计模式(如Decorator),这是通过称为拓展的特殊声明来实现的。例如,你可以从无法修改的第三方库位类编写新函数。这些函可以按照通常的方式调用,就像它们是原始类的方法一样。这种机制称为拓展函数。还有一些拓展属性允许你为现有类定义新属性。简单点来说,当你想在某个类加新功能时,为了避免在原来的类做修改,可以在别的类中为该类设计新代码。拓展是一种静态行为,对被拓展的类代码本身不会造成任何影响。..

2020-08-17 19:07:42 911

原创 Kotlin专题「十一」:可见性修饰符(private、protected、internal、public)

前言:不要假装很努力,因为结果不会陪你演戏。一、概述  类,对象,接口,构造函数,函数,属性及其setter可以具有可见性修饰符(getter始终具有与属性相同的可见性)。在 Kotlin 中有四个可见性修饰符:private,protected,internal和public。默认可见性是public(在没有显式修饰符时)。下面将会给大家讲解修饰符如何在应用声明作用域的不同类型。这里先来介绍一下类的几种修饰符,它包含 classModifier 和 accessModifier:1.1 c..

2020-08-14 17:21:25 3277

原创 Kotlin专题「十」:接口与函数接口(Functional (SAM) interfaces)

前言:不要当父母需要你的时候,除了泪水,一无所有;不要当孩子需要你的时候,除了惭愧一无所有;不要当自己回首过去的时候,除了蹉跎一无所有。一、概述  Kotlin 中的接口可以包含抽象方法的声明,也可以包含方法实现。接口与抽象类的区别在于接口不能存储状态。它们可以具有属性,但是这些属性必须是抽象的或者提供访问器实现。Kotlin 中接口与 Java8 类似,使用 `interface` 关键字定义接口,允许方法有默认实现:```kotlin interface M

2020-08-13 17:38:03 1463

原创 Kotlin专题「九」:包与导入(Packages and Imports)

前言:一剪薄弱的光,也要骄傲地捧出辉煌。一、概述  Kotlin 中的导包也是一门学问,刚从 Java 转 Kotlin 的时候经常导错包或者不知道怎么导适合的包,这里来为大家讲解下 Kotlin 的导包规则。(另外,Kotlin专题的文章会持续更新下去,目前只是更新了一小部分,后面就抓紧时间将剩下的奉上给大家。学习的越深入越会被 Kotlin 简洁的代码以及良好的代码阅读性深深的被折服,当然在学习过程会难免会枯燥乏味,也会遇到困难,这也是提现了每个人的毅力与意志,对知识的渴望,一起共勉!)二、..

2020-08-12 18:39:15 987

原创 Kotlin专题「八」:属性与字段(Getter()与Setter(),后备字段field)

前言:人生只有走出来的美丽,没有等出来的辉煌。一、概述  前面已经为大家讲解了类的使用以及属性的相关知识,在一个类中基本上都会出现属性和字段的,属性在变量和常量的文章中有详细讲解到,这里会重新简单介绍到。1.1 属性的定义类中基本上都会存在属性,使用`var`和`val`修饰,`var`声明为可变,即可读可写;`val`声明为不可变,即只能读不能改。类中的属性必须初始化值,否则会报错。...

2020-08-07 18:37:35 3002 2

原创 Kotlin专题「七」:类和继承

前言:不是所有的坚持都有结果,但是总有一些坚持,能从一寸冰封的土地里,培养出十万朵怒放的玫瑰。一、概述  任何一种面向对象的编程语言里面,类class是非常基础也是非常重要的,万物皆对象,对象就是我们所说的类,Kotlin 也不例外。二、类的声明Kotlin 类可以包含构造函数、初始化代码块、函数、属性、内部类、对象声明等,使用关键字 class 声明类,后面紧跟类名: class A { //属性 //TODO //函..

2020-07-31 18:56:52 450 1

原创 Kotlin专题「六」:函数的声明和使用

前言:生命不息,奋斗不止,只要相信,只要坚持。一、概述  对于 Kotlin 中的函数来说,和 JavaScript 语言很像,对于 Java 来说它不是闭包的,这里主要讲函数的基本使用,包括函数的定义,参数,返回值等。同时介绍函数参数使用默认值和单表达式函数的使用。二、函数的声明及使用2.1 函数的声明Kotlin中函数的声明关键字为`fun`,定义的各式为:...

2020-07-29 16:04:39 825

原创 Kotlin专题「五」:可空类型?,空安全?.,空值合并?:,非空断言!!,类型安全转换as?

前言:不走心的努力,都是敷衍你自己。你要坚信现在所有过不去的坎,将来总有一天会当笑话说出来。一、概述  Java 中定义一个变量可以默认不赋值,因为系统默认会赋值一个默认值,并且可以定义一个为 null 的变量,这样在使用的时候就需要判断该变量是否为 null 。从代码的简洁性以及代码的可读性来说,Kotlin 能更好处理,那么 Kotlin 定义一个可为 null 的变量怎么定义呢?下面针对 Kotlin 这一特性来详细讲解。二、可空类型三、空安全四、非空断言...

2020-07-24 12:30:41 2003

原创 Kotlin专题「四」:逻辑控制语句(if、for、when、while、return、break、continue)

前言: 有些路看起来很近,可是走下去却很远,缺少耐心的人永远走不到尽头。人生,一半是现实,一般是梦想。一、概述  前面几篇文章中讲解了 Kotlin 的常量、变量、数据类型和作用域函数等,与 Java 相比还是有一定的区别。这里给大家介绍 Kotlin 的相关逻辑控制语句,如:if,for,when,while等。Kotlin 中没有 Java 中的三元运算符,但是用if语句可以实现类似效果;when语句替代了 Java 中的 switch语句;for循环语句废除了 Java 中的(初始值;条件;..

2020-07-22 13:15:19 2015

原创 Kotlin专题「三」:数据类型(数值类型,布尔类型,字符类型,字符串类型,数组类型)

前言: 有一种落差是,你配不上自己的野心,也辜负了所受的苦难。一、概述  我们知道,Java 中数据类型分为基本数据类型和对应的包装类型,比如 Java 中的整形 int 和对应的包装类 Integer 。在 Kotlin 中是没有这样区分的,例如对于整型来说只有 Int 这一个类型,Int 是一个类,编译时会根据情况把这个整型 Int 编译成 Java 中的 int 还是 Integer ,那么是根据什么情况来判断的呢?我们先来看看 Kotlin 与 Java 数据类型的对比:Kotl..

2020-07-06 19:04:48 1569 1

原创 Kotlin专题「二」:变量(var与val)、常量、注释

前言: 莫问良人长与短,从此山水不相逢。一、概述  大家都知道 Kotlin 现在被 Gooogle 定为 Android 的官方开发语言。Kotlin 在项目中的使用将会越来越广泛,这也掀起了一波学习 Kotlin 的浪潮,作为一名 Android 开发者 Kotlin 是必须要掌握的。Kotlin 是由 JetBrains 在2010 年推出的基于 JVM 的新编程语言,是一种新的静态类型编程语言。开发者称开发它的目的是避免 Java 语言中的一些难题。Kotlin 基于 JVM 的字节结构..

2020-07-03 16:11:21 4622

原创 Kotlin专题「一」:你了解Kotlin的let,with,run,apply,also作用域函数的区别吗?

前言: 成和败要努力尝试,人若有志应该不怕迟。一、概述  Kotlin提供了不少比Java高级的语法,在Kotlin标准库中[(Standard.kt)]提供了一些Kotlin拓展的内置函数,可以优化编码,比如let,with,run,apply,also等。Standard.kt是Kotlin库的一部分,它定义了一些基本函数,功能非常强大。1.1 Kotlin回调函数的优化Kotlin中对Java一些接口的回调做了优化,可以使用lambda函数来替代,可以简化代码和

2020-06-09 14:12:52 922 1

原创 Android四大组件Activity系列之一——概述

前言: 人总是理所当然的忘记,是谁风里雨里,一直默默的守护在原地。一、概述  Activity是Android应用的四大组件之一,它负责管理Android应用的用户界面。大多数应用有多个界面,这就意味着包括若干个Activity,每一个Activity组件负责一个用户界面的展示。通常应用中的某一个Activity被指定为主界面,这是应用用户启动时出现的第一个屏幕,然后每个Activity...

2020-05-03 17:11:36 666

空空如也

空空如也

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

TA关注的人

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