自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

菜鸟博客

不积跬步无以至千里

  • 博客(458)
  • 资源 (25)
  • 收藏
  • 关注

原创 Java并发编程实战读书笔记5 ---Executor在android中的应用

最近业余时间在读《Java并发编程实战》这本书,现在已经读到了第二部分。该书上有这么一段话:如果你的项目中出现这样的代码 new Thread(new Runnable() { @Override public void run() { } }).start();的话,那么你可以考虑使用Executor了这句话让我想到了我以前 在项目中对Executor做了一个小小的封装,可以当做一个小小的工具类使用。封装后可以将上面代码改成: //ExecutorType是一个枚举类,TASK_ON_PER

2021-10-28 14:59:18 206

原创 Android的TextView设置padding无效

最近在开发了一个新的功能,有如下UI样式:我采用动态代码的方式来实现的,代码如下: TextView textView = new TextView(context); textView.setTag(action); textView.setTextSize(7); textView.setGravity(Gravity.CENTER); textView.setTextColor(Color.WHITE); textView.setText("

2021-10-25 16:54:48 1090

原创 android 可拖拽View的简单实现

private void initListener() { setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.e("advertView","click ad"); } }); closeImageView.setOnClickLis

2021-10-24 14:36:23 1359

原创 java并发编程实战读书笔记4--生产者消费者模式和队列

1、BlockingQueue简化了生产者-消费者设计的实现过程,支持任意数量的生产者和消费者。常见的实现就是线程池与工作队列的组合,在Executor任务执行框架中就体现了这种模式。2、在构建高可靠的应用程序时,有界队列是一种强大的资源管理工具:它能抑制并防止产生过多的工作项,使应用程序在负荷过载的情况下变得更加健壮。3、生产者-消费者模式能够将生产者和消费者的代码彼此解耦,但是他们的行为仍然会通过共享工作队列耦合在一起。4、LinkedBlockingQueue和ArrayBlockingQueu

2021-10-19 21:13:47 310

原创 java并发编程实战读书笔记3

1、ConcurrentModificationException 当容器在迭代过程中被其他线程修改时,就会抛出该异常。想要避免该以后该异常,就需要在迭代的过程中持有该容器的锁。但是长时间持有容器的锁会降低程序的可伸缩性,持有锁的时间越长,那么该锁的竞争就会越激烈,就会降低吞吐量和CPU的利用率。也可以克隆容器,在副本上操作避免出现此异常。比如Vector和Hashtable就可能抛出该异常。2、Queue用来临时保存一组等待处理的元素,在Queue上操作不会阻塞。而BlockingQueue则扩展了Qu

2021-09-26 16:17:41 95 1

原创 java并发编程实战读书笔记2

1、volatile ,是一种比sychronized关键字更轻量级的同步机制,在访问volatile变量时因为不会执行加锁操作,所以不会导致线程阻塞。volatile变量也有局限性,比如它不足以确保递增操作(++)的原子性。该变量通常用作某个操作完成,发生中断或者状态的标志。典型用法如下:volatile bolean asleep;while(asleep){ countSomeSheep();}加锁机制既可以确保可见性又可以确保原子性,而volatitle变量只能确保可见性,在读

2021-09-11 13:46:03 135

原创 Flutter 之A value of type ‘‘ can‘t be assigned to a variable of type的错误解决笔记

最近工作不是很忙,于是乎又是捡起Flutter继续学习。在github上找到一个flutter的学习demo,准备学习学习其动画。运行github上的代码发下了如下错误:Error: A value of type 'Animation<BorderRadius?>' can't be assigned to a variable of type 'Animation<BorderRadius>' because 'BorderRadius?' is nullable and

2021-09-10 15:02:34 5447

原创 Java并发编程实战读书笔记(1)

1、无状态对象一定是线程安全的。因为无状态的对象不包含任何变量或者其他类的引用。2、在某线程修改某变量的时候,需要通过某种方式,比如加锁,来防止其他线程使用该变量。3、在java.util.concurrent包含了一些县城安全的对象,比如AtomicLong.在实际情况中,尽可能低使用现有的线程安全对象。避免重复造轮子。4、每个java对象都有一个实现同步的锁,被称为内置锁,它是可以重入的,也就是说一个线程试图获取一个已经由他自己持有的锁,那么这个请求就会成功。关于重入锁,可以简单的阅读博主的Jav

2021-09-08 21:39:57 157

原创 Android Studio Connection refused

在使用Android Studio运行项目的时候,有时候会报错Connection refused,所以项目中的gradle.properties文件里面会有如下配置信息:运行Android Studio,编译了半天会报文章标题所述的错误,解决方法就是将上图gradle.properties文件里,红色矩形选中的部分给删除掉即可。在此总结一下,以免以后忘了。...

2021-09-08 10:29:21 2421

原创 设计模式之桥接模式

说实话,在应用中很少使用这个模式,这个模式个人表示有点令人费解。但是我想着既然自己单独弄了个设计模式的专栏,那就要一个不拉的把它们都写完,给本专栏来一个完美的结局。定义将抽象和实现解耦,使得它们可以分别独立的变化。该模式是继承关系的替代方案用处:可以通过聚合代替继承来解决子类爆炸性增长的问题应用例子:小说《知北游》这部十几年前看过的第一部网络小说,不知道读者里面有没有读过这本小说的同道中人,当时真的是被里面的内容给惊艳到了,原来小说还可以这么写吗!现在的网络小说基本上都是套路文,没啥看头了。咳咳

2021-08-27 02:24:02 191 2

原创 Android 项目经验汇总:Fiddler的坑,证书无效

1、Fiddler的坑,证书无效Fiddler是用来抓包的强大工具,但是按照流程安装证书等一系列操作之后,会发现要抓包APP的HTTPS链接始终无法访问,提示证书问题。然后看网上说是需要root手机,然后安装什么Xposed、TrustManager.然后我就纳闷了,以前手机抓包好好地,怎么现在不可以了呢,于是乎就换了个Android 5.1的测试机,结果顺利抓包。压根不用什么劳什子的XPosed之类的折腾。2、对接SDK的坑我们Android APP最近升级了一个SDK,结果发现我们线上Cras

2021-08-19 08:46:27 4069

原创 Java 线程池 ThreadPoolExecutor源码简析

如果你对线程池的概念还不甚了解,那么Java 线程池 Executor浅入浅出这篇文章可以让你一步步从0到1了解线程池的搭建过程。在Executors中为我们提供了多种静态工厂方法来创建各种特性的线程池,其中大多数是返回ThreadPoolExecutor对象。因此本篇博文直接对ThreadPoolExecutor的原理进行剖析,加深对线程池设计的理解。ThreadPoolExecutor有如下两个重要参数:corePoolSize线程池核心线程的数量。如果线程池里得线程个数小于corePoolSiz

2021-08-14 13:06:21 222

原创 国企工作点滴总结

眨眼之间,时光飞逝。入职新公司已经一年多了,总觉得需要写点什么,总结下自己这一年的收获。工作了这么多年,经过了这么多公司,发现一个共同的现象:每家公司都有自己吐槽的地方,不只是自己吐槽,跟同事一起吃饭的时候,同事也吐槽公司的种种不是。这种现象问题根由是什么呢?在于自己?还是在于公司?其实这点不必要纠结,金无足赤,怎么可能事事都按照自己心中所想的来运转?唯一能做的就是在既有的框架和环境下,不断的调整自己,去适应,去生存和去突破。改变不了别人或者组织,就从自我改变开始。不接受又不想改变,就不用吐槽了,直接

2021-08-03 13:45:34 303 2

原创 使用JSONObject toString后,会增加反斜杠转义符

最近遇到一个问题,在此记录下来,算是个工作经验总结。看下面的Java程序,本意是将生成一个json字符串给后台使用。 private String createParams() { HashMap<String, String> map = new HashMap<>();//客户扩展信息 map.put("param1", "1"); map.put("param2", "2"); //im新增历史记录参数

2021-07-29 09:04:58 9078 2

原创 一个程序员的爱情和他的小棉袄

本人屌丝程序员一枚,业余时间自学了PS,哦,专业叫法Photoshop。今年喜得可爱小棉袄一枚,特此写篇博客记录下宝宝和我老婆的照片。照片经过自己蹩脚的PS技术合成的。老婆孩子在老家,自己一人在上海工作,已经好多天没见到闺女了,甚至想念。1、亲爱的宝宝,老爹愿意当你的守护熊,希望你开开心心快乐长大。2、调皮的小可爱,希望现在的“丑”小鸭,以后能长成白天鹅。3、亲爱的老婆,你就是我的天使。4、怀孕之前的老婆,美丽的倩影。5、我的天使小可爱。6、晚安,我的宝贝,就在爸爸给你建造的蘑菇屋里酣睡

2021-07-19 09:34:36 397 3

原创 Flutter Fish-Redux插件入门指南

CountAction,CountState、CountPage

2021-07-08 11:20:56 310

原创 Flutter学习资源汇总(不定期更新)

本人业余时间学习Flutter的资源汇总如下:1、Flutter 中文官网这可以当做学习Flutter的第一手资料。从开发环境搭建,到实例化教程、性能优化,以及样例代码。可以帮助初学者轻松上手。2、flutter常用插件github列表这些插件由谷歌官方维护,包括webview_flutter,googles_maps_flutter,video_player等,每个插件都有详细的使用样例代码。3、SQFLite库方便在你的Flutter应用中使用SQLite,支持iOS和Android系统

2021-07-06 13:58:12 305

原创 Flutter获取packageName和versionCode

当你为你的Flutter项目选择一些有用的第三方库的时候,Flutter Favorite 提供的列表也许是你的最佳首选。Flutter Favorite 项目是为了在你构建应用时,能够向你提供你应该优先考虑的 package 和插件。你可以在 pub.dev 上看到完整的 Flutter Favorite packages 列表。在这个列表里有好多Flutter常用的插件,比如Provider,Redux,Flutter-Redux,网络库插件等等。比如我希望获取APP的包名和版本号,那么 Flutte

2021-07-05 10:39:52 1390

原创 Flutter之Flutter-Redux框架源码解析

library flutter_redux;import 'dart:async';import 'package:flutter/widgets.dart';import 'package:redux/redux.dart';/// Provides a Redux [Store] to all descendants of this Widget. This should/// generally be a root widget in your App. Connect to the

2021-07-03 22:25:09 247 1

原创 Flutter之Redux框架原理解析

Flutter之Redux入门一文简单的介绍了Redux的使用方法,Redux在Flutter中可以用来状态分享来使用。现在就来简单分析下其原理。其实原理很简单,涉及到的文件就两个,如下图:redux的核心逻辑都在store.dart这个文件里面。可以用下图来描述Redux的核心工作流程。对这个图不了解的话,暂时没关系,本文会一点点剖析。不考虑Flutter的话,纯粹在Dart里面使用Redux总共有如下三个步骤:1、创建Reducer函数在这里定有了两个action,一个是++action,一

2021-06-29 14:17:17 470

原创 Flutter之Redux框架入门

https://github.com/pszklarska/flutter_shopping_cart/tree/4756839d5749dfa36073e830b208bb45cb5f8874https://hackernoon.com/flutter-redux-how-to-make-shopping-list-app-1cd315e79b65https://flutter.cn/docs/development/data-and-backend/state-mgmt/options

2021-06-28 19:32:47 330 2

原创 Flutter Provider框架实战

Provider 框架实际应用

2021-06-25 13:27:12 382

原创 Flutter之跨组件状态共享Provider框架剖析(2)

在Flutter之跨组件共享状态Provider原理剖析抽丝剥茧,初步讲解了Provider的基本用法,博文的最后留下了一个问题:每次使用Provider获取值得时候,都要调用Provider.of方法,耦合太重。而且繁琐,比如如下代码: Text( Provider.of(context).value.toString(), style: TextStyle(color: Colors.blue, fontSize: 48))很明显有如下问题:1、需要显式调用Provider.

2021-06-03 10:15:10 2597 2

原创 Flutter跨组件共享状态的利器Provider原理解析

阅读本篇博客之前,建议读者读读以下两篇文章,Flutter之夸组件共享状态Provider原理剖析和Nested组件,解决Flutter布局嵌套过深的利器,通过这两篇文章你可以了解到:1、InheritedWidget的工作原理,Provider组件就是对InheritedWidget的二次封装。2、ComponentElement的构建Widget的工作原理。3、Nested组件的作用和构建原理,因为MultiProvider组件就是在Nested基础上实现的。而且Provider的父类Inheri

2021-06-02 09:56:09 544 4

原创 Nested组件,解决Flutter布局嵌套过深的利器

使用Flutter写过布局的你,肯定会见过类似下面的代码:AWidget( child: BWidget( child: CWidget( child: DWidget( child: LeafWidget(),//子节点 ) ) )) 上面的代码嵌套过深,层层嵌套,没有什么可读性。有一个组件能够解决这个问题,这个组件就是Nested组件,使用该组件你可以将上面代码改成如下所示:Nested( children: [ AW

2021-05-26 16:24:28 722 2

原创 一款APP其实就是各种SDK的集合体

一款常规的Android APP基本上都是各种SDK的集合体,好多主要功能,比如网络框架啦都有专门的SDK。

2021-05-25 13:58:37 427

原创 Flutter之跨组件共享状态Provider原理剖析

参考资料:Flutter之实战InheritedWidget详解数据共享(InheritedWidget)跨组件状态共享状态管理介绍Flutter 官方Provider ReadMe在Flutter中什么是状态呢?Flutter官方给出的定义就是“当任何时候需要重建用户页面时,你所需要的数据”。状态分为短时状态(ephemeral)和应用状态(app)两种。短时状态就是不需要与其他UI共享的状态,比如当前Widget动画的进度。怎么区分短时状态和应用状态呢?官网给了一个很容易理解的图来区分短时状

2021-05-25 09:32:16 383

原创 Flutter 开发环境搭建Unable to ‘pub upgrade‘ flutter tool. Retrying in five seconds...

好久没更新Flutter专栏了,一是因为懒。而是因为在公司的Windows 10上配置flutter环境总是出错,然后就以此为借口懒得弄了,这不Flutter 2.0出现了,又燃起了我学习Flutter的热情。今天周末来公司加班,就一举搞定了flutter的开发环境配置问题。配置流程如下:1、在github上搜flutter,然后将其clone到本地2、配置好环境变量3、配置好镜像,配置好以后需要重启电脑,这一点很重要,如果不配置镜像的话,会出现“Unable to ‘pub upgrade’ fl

2021-05-22 08:51:51 1350

原创 力扣之删除中间节点

该题是力扣上面的一道难度为简单的题,虽然难度标志为简单,但是确实挺有意思的,下面就来分析分析这道题(原题传送门),题目描述如下:若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。例如,传入节点 c(位于单向链表 a->b->c->d->e->f 中),将其删除后,剩余链表为 a->b->d->e->f 示例:输入:节点 5 (位于

2021-05-19 14:58:53 257

原创 Android Okhttp 配置HTTPS

package com.net;import android.support.annotation.Nullable;import android.text.TextUtils;import android.util.Log;import com.bocitools.utils.BociLog;import com.bocitools.utils.BociUtil;import com.bocitools.utils.FileUtil;import com.google.gson.Gson;

2021-05-15 14:09:35 849

原创 Android MotionLayout学习笔记

参考官网资料:使用 MotionLayout 管理运动和微件动画MotionLayout 示例MotionLayout 参考文档MotionLayout官方demo源码MotionLayout布局是约束布局ConstraintLayout 的之类,提供了强大的动画控制功能,比如一个Button可以根据手指的移动,从左水平移动到右边。不需要添加额外的代码,直接在xml里面就可以配置了。更多的示例代码及其运行效果可以参考MotionLayout 示例下来看看上图布局文件的代码很简单:<an

2021-04-23 11:15:02 298

原创 Android 应用快捷方式 ShortcutManager 简单说明

学习Android知识的第一手资料,看官网资料最为妥当,本篇博文参考中文官网资料如下:1,快捷方式概览2、创建快捷方式,分为静态创建和动态创建。内部有详细代码。3、管理快捷方式4、使用快捷方式的最佳做法5、官网demo事实上这些资料都是ShortcutManager这个类的英文注释翻译,其实看了以上这些资料以及运行一下官网demo,完全就可以掌握应用快捷方式的使用方法了,事实上上面的资料也都是。不过在这里小小吐槽一下Android 自己提供的demo,居然有两处bug。在配置静态快捷方式的时候,

2021-04-21 09:57:57 1661

原创 android 深色主题背景适配原理剖析

最。近有个需求,就是APP要适配深色主题,于是乎就查阅相关资料。当然第一手资料就是官网 参考链接 官方资料:深色主题背景 和 官方demo本文就是在官网资料基础上进行了学习总结,以备不时之需。...

2021-04-16 17:18:24 431

原创 设计模式之原型模式

该模式又称之为克隆模式,该模式相对来说很简单。其实这个模用一个词来形容最恰当不过,这个词就是“依葫芦画瓢”。之所以使用克隆模式创建一个对象,可能就是直接创建该对象的代价和成本较大,比如在昂贵的数据库操作之后要创建一个对象。我们可以缓存对象,在下一个请求时返回其克隆,并在需要时更新数据库,从而减少数据库调用。这样,即达到了创建对象的目的,也减少了对数据库的频发操作。何乐而不为。使用过Okhttp这个类的创建还是挺复杂的,而且这个类本身也提供了一个clone方法: class OkhttpClient im

2021-04-09 11:01:20 192 2

原创 设计模式之中介者模式

中介者模式,这个设计模式在博主的工作中,好像几乎没有主动用过。但是其思想理念倒是可以借鉴使用。在这里做个学习笔记,以便于加深自己的理解。中介模式的主要目的和作用,其实就是减少不同类(对象)之间的依赖关系,特别是复杂对象之间的混乱无序的依赖关系,比如A依赖B,B依赖C,C依赖D,D依赖E,D依赖A等等吧,看下图,各个对象之间的直接交互的话,是多么杂乱无章,简直是真是剪不断理还乱。几乎每个对象都需要和其他对象产生关系,也就是需要花精力维护着其他对象的引用。面对这种设计,中介者就起到了快刀斩乱麻的作用,对

2021-04-08 14:33:30 182

原创 设计模式之外观模式

参考资料:外观模式Design Patterns - Facade Pattern外观设计模式学习这个模式的时候让我想起了阿基米德的一句话:“给我一个支点,我可以把地球撬动起来”,这句话用在外观设计模式上最恰当不过。因为外观设计模就是一个“以小博大”的“快捷键”模式。因为它的定义就是:“隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口”。这句话可以这么理解:“仅仅通过一个接口,就可以访问隐藏了复杂细节的系统!”. 这不就是以小博大嘛!如果还不了外观模式的意图,想想如下几个问题:1、

2021-03-19 11:19:12 232

原创 设计模式之装饰者模式

用搜索引擎搜装饰者模式,可以搜到一大堆的说明。但是为什么我还要写这篇文章呢?因为我感觉我写的跟别人不一样,读了之后相信你会有不同的收获。https://www.runoob.com/design-pattern/decorator-pattern.html...

2021-02-20 11:09:10 228

原创 设计模式之迭代器模式

面向对象的三大特性:继承、多态和封装。这三者相辅相成,共同催生出了各种设计模式。迭代器模式就是其中之一。俗话说物以类聚,人以群分。在面向对象的世界中往往相同的对象会相聚成集合。比如一飞机的乘客是一个集合、一地铁的乘客也是一个集合、一公交车的乘客也是一个集合。也就是说乘客们在不同的交通工具下装载下,是一个不同的集合。我们不需要暴漏和知道乘客乘坐的是什么具体交通工具,就可以遍历所有的乘客。这也是迭代器模式的初衷。专业术语表述就是 迭代器模式可以让你在不暴露集合底层表现形式(链表、栈和树)的情况下便利集合中

2021-02-13 15:31:21 435 2

原创 设计模式之组合模式

开篇引言:“从前有座山,山上有个庙,庙里有个和尚在讲故事,讲什么故事呢?将从前有座山,山上有个庙,庙里有个和尚在讲故事,讲什么故事呢?从前。。。。”对于Android开发者来说,下面这幅图应该会很熟悉。在一个APP页面中,经常是一个ViewGroup容器包含了众多子ViewGroup和View,就像老和尚讲故事那样,层层嵌套,组成一个树形结构。在面向对象的世界中,什么样的对象才能组合成树形结构呢?用“本是同根生”这句来表示是最合适不过。我们知道面向对象的一大特征就是继承,一个基类可以派生出若干之类,之

2021-02-09 14:05:56 295

原创 Android RootTrustManager 证书校验简单分析

阅读本篇博文,博主假设你已经按顺序读过下面三篇文章。Android okhttp https TrustManager简单总结Android CertificateSource 简单说明Android AndroidNSSP的简单说明在Android AndroidNSSP的简单说明我们知道,Android在安装AndroidNSSP这个Provider的时候,初始化了系统证书管理器,以及RootTrustManager ,今天文章的主角就是这个RootTrustManager 。从结构来看,该类

2021-01-29 10:55:43 1663

Android ASM 代码自动化埋点

结合ASM Bytecode Viewer插件,使用ASM技术对Android 的点击事件onClick方法进行插桩。剖析Android 自动化埋点的具体实现原理。在onClick方法执行之前或者之后自动执行指定的代码,可以用来收集用户的点击操作。用来自动化埋点。

2022-04-23

线性贝塞尔曲线的说明

贝塞尔曲线的简单实现算法

2017-02-26

android SDK热修复

android jar热更新机制

2016-11-07

RxJava简单应用

RxJava的简单应用,显示应用列表以及下载文件并更新进度条

2016-06-29

自定义简单GridView

主要是通过这个小小的demo来体会一下view的测量过程

2016-04-03

模仿QQ侧滑删除

简单的应用了ViewDragHelper实现了Qq聊天工具的侧滑删除布局

2016-03-09

QQ侧滑简单实现

2016-03-08

ViewDragHelperDemo

用ViewDragHelper简单的写的测试demo,说明了 clampViewPositionVertical等callback方法的应用

2016-03-04

Scroller简单应用

简单的用Scroller+layout来实现ImageView的平缓移动

2016-02-22

自定义跑马灯次数

实现了TextView控制跑马灯的次数的效果

2016-02-18

控制跑马灯次数的TextView

可控制跑马灯次数的自定义TextView

2016-02-18

自定义导航栏(2)

对之前的版本做了简单修改,丰富了ViewFlipper做导航页面的效果

2016-01-21

自定义ViewFlipper

对ViewFlipper功能做了扩展,响应左右滑动事件进行翻页

2016-01-20

ViewAnimator简单实现PPT

ViewAimator简单实现ppt页面切换效果

2015-12-15

ViewFliper简单实现PPT

用ViewAnimator简单实现了类似ppt页面切换的效果,很简单的代码

2015-12-15

Gson解析流程图

Gson解析流程图,详细的描述了Gson反射机制的解析流程

2015-10-22

自定义横向listView4.0

解决了版本3.0的遗留的问题,并对解决方法尽可能进行了详尽的描述

2015-06-04

自定义横向listView3.0

可左右滚动的横向listView,listView随着手指的移动而移动

2015-06-02

横向的listView version2

在版本1.0的基础上实现了点击滚动的功能,很简单的代码,更过功能在3.0实现

2015-05-20

水平ListView小demo

简单的实现了水平的lsitView,初学者可以看看,大神们可以提点建议

2015-05-17

大风车系列demo

android 自定义View模拟风车旋转的小demo

2015-05-04

坦克大战小游戏

自己做的坦克大战,虽然设计不是怎么合理,还算凑合

2011-11-28

桌面弹球游戏代码以及个人总结

这是我自己写的总结,不是很好,但还凑合,希望对大家有帮助

2011-07-12

控制台简易五子棋java代码

这是java实现的五子棋代码,对于初学者来说很有用

2011-04-28

比较好的Java学习网站

里面是一些学习Java的个人认为比较好的网站,可以利用一下

2010-06-28

空空如也

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

TA关注的人

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