秋招斩获所有互联网大厂面经之Android

>> 背熟,唯手熟尔,大家都这么厉害,只能记得更准才行。
 
1
四大组件
各个组件阐述:
① Activity 活动:是一个单独的屏幕或窗口,Activity 之间通过 Intent 进行通信,每一个 Activity 都必须要在 AndroidManifest.xml 声明。
② Service 服务: 在后台完成的服务。分为 start 和 bind 两种。startService() 和 bindService() 的区别是,startService() 的生命周期和启动它的组件无关,bindService() 和调用者绑定在了一起,共存亡。
③ Content Provider 内容提供者:一个应用程序可以提供数据集给其他应用程序,如通讯录,可以实现在多个应用程序之间共享数据。使用的 URI 前缀是 content://
④ Broadcast Receiver 广播接受者:对感兴趣的外部事件进行响应,自己没有界面但是可以启动一个 Activity 或者 Service,或者发布一个通知。注册方法有两种,动态注册和 xml 中静态注册。动态注册与 Activity 共存亡,静态注册哪怕 app 未启动也有作用。
总结:
① 四大组件的注册:除了 Broadcast Receiver 可以动态注册,其他都需要静态注册。
② 四大组件的激活:Content Provider 通过 ContentResolver 激活,其他通过 Intent 激活。
③ 四大组件的关闭:Activity 通过 finish() 方法关闭,Service 通过 stopService() 或 unBindService() 关闭,其他没必要显式关闭。
 
 

-----------------------------------

2
六大布局
① 线性布局 (LinearLayout)
② 框架布局 (FrameLayout)
③ 表格布局 (TableLayout)
④ 相对布局 (RelativeLayout)
⑤ 绝对布局 (AbsoluteLayout)
⑥ 网格布局 (GridLayout) 
 
 

-----------------------------------

3
五大存储
SharedPreferences、文件存储、SQLite数据库方式、内容提供器(Content provider)和网络。
① SharedPreferences:存储一些简单的配置信息,如记住用户名,通过 xml 保存在 shared_prefs 文件夹下。
② 文件存储:可以通过 openFileInput 和 openFileOuput 读写自身目录下的文件。
③ SQLite数据库:是 Android 自带的数据库。
④ Content Provider 内容提供者
⑤ 网络存储:注册网络权限、通过 HTTP 请求数据。
 
 

-----------------------------------

4
如何排查 OOM
① 通过监控工具和 GC 日志,如 LeakCanary 检测内存泄漏,然后使用 Android Studio 自带 Android Profiler 导出,mat 工具分析。
② 代码层面打印。
③ 通过 Dump 文件观察 OOM 时的内存镜像。
④ 上线前通过压测解决潜在的 OOM 问题。
 
 

-----------------------------------

5
ListView 和 RecyclerView 区别
① 动画:ListView 需要自己实现,RecyclerView 内置很多动画。
② 刷新:ListView 是全局刷新,RecyclerView 可以局部刷新。
③ 缓存:RecyclerView 多了两级缓存,且缓存池可以共用。
 
 

-----------------------------------

6
ListView 优化
① 复用:通过 ViewHolder 复用 convertView,类似一个缓存,不存在则创建并 setTag(),存在则 getTag()
② 图片:异步加载 (Glide)、使用缩略图、小图,快速滑动时不加载图片
③ 层级:减少 List Item 的层级。 
④ RecycleBin 机制:滑动窗口实现的虚拟滚动,移出屏幕则加入 RecycleBin,进入屏幕从 RecycleBin 获取,可以避免数据多时 OOM。
 
 

-----------------------------------

7
点击事件设置监听的方式
① 匿名类:new View.OnClickListener()
② 外部类:自定义类继承 View.OnClickListener
③ Activity 实现 View.OnClickListener
④ layout 文件中使用 onclick 属性指定方法名。
 
 

-----------------------------------

8
Activity 生命周期
① 共 7 个:onCreate(), onStart(), onResume(), onPause(), onStop(), onRestart(), onDestory().
② 是否可见:onStart() 在前台看不到也无法交互、onResume() 能看到可以交互、onPause() 能看到不能交互、onStop() 看不到。
③ 屏幕旋转时生命周期的变化:如果不设置,会先停止再重新创建:
停止:onPause() -> onStop() -> onDestory()
创建:onCreate() -> onStart() -> onResume()
解决办法:在 xml 给 activity 增加 configChanges 属性: screenSize | orientation | keyboardHideen.
 
 

-----------------------------------

9
页面之间如何传递数据?
① Intent 传值,onActivityForResult 回传。
② 传递对象:序列化 Serializable.
③ 传递集合:转换成 List。
 
 

-----------------------------------

10
dp / px / sp
① dp: 与密度无关的像素单位,不同设备上不一样。
② px: 一个像素点。
③ sp: 与尺寸无关的像素单位,一般用于字体大小。
 
 

-----------------------------------

11
Handler 机制
① 组成:Handler, MessageQueue, Looper.
② 功能:Handler 负责消息的收发,MessageQueue 负责存储,Looper 负责消息的管理。
③ 原理
1、过程:handler 获取一个消息对象,通过 sendXXX 方法 push 到队列中,Looper 轮询这个队列取出消息对象,通过 dispatchMessage 分发给 Handler,回调时使用 handlerMessage() 处理消息。
2、线程安全:是线程安全的。
3、数据结构:Message 对象底层使用链表,最长为 50。
 
 

-----------------------------------

12
什么是 ANR, 如何避免?
① 概念:Android Not Responding,安卓主线程响应时间为 5 秒,5 秒内没响应则回收。
② 避免:耗时的工作在子线程中做。
 
 

-----------------------------------

13
广播接收方式、广播类型
广播接收方式
① 常驻型:在 AndroidManifest.xml 中静态注册,关闭后也能收到。
 非常驻型:代码中 resigterReceiver() 注册,生命周期与启动者绑定。
广播类型
① 普通广播:最常用的 setAction(名称)
② 系统广播:涉及到手机的基本操作的广播。
③ 有序广播:发出去的广播被按顺序接收。
④ 应用内广播:使用 setPackage() 解决冲突和安全性问题。
⑤ 粘性广播:5.0 以后已经失效。
 
 

-----------------------------------

14
Service 和 Activity 传递数据
① bindService()
② 广播、Interface、Handler、bind 对象。
 
 

-----------------------------------

15
下载如何实现断点续传
① 原理:HTTP 报文中,客户端通过 Range 告诉服务端从指定的位置下载,服务端通过 Accept-Ranges 告诉客户端支持断点续传,通过 Content-Range 告诉客户端返回的数据信息。
② 安卓实现:最方便的是 xUtils.HttpUtils,支持多线程断点下载。如果自己写的话:通过 GET 请求获取文件总长度,然后创建等长的临时文件,用长度除以线程数,计算每个线程的开始和结束位置,然后开启多线程下载,将下载结果存在对应位置。断点位置可以通过一个 int 变量存储。
 
 

-----------------------------------

16
Android的进程间通信方式
① Bundle: 通过 Intent.putExtras(bundle) 传递。
② ContentProvider: 跨进程访问其他应用程序中的数据。
③ 文件:共享存储的方式实现进程通信。
④ Broadcast: 跨进程的应用程序监听这些广播。
⑤ AIDL: 全称是 Android Interface Design Language, 中文安卓接口设计语言,是一个类似于 socket 的服务,服务端给客户端统一提供数据。
⑥ Messenger:基于 AIDL,使用 Messenger 发送数据,使用 Handler 处理数据。
⑦ Socket: 在子线程中实时交换网络数据。
 
 

-----------------------------------

17
Android中自定义View的流程
① 实现 Measure、Layout、Draw
  • onMeasure():遍历所有子 View 并测量、合并所有子 View 尺寸、存储测量后的子 View 宽高。
  • onLayout(): 遍历子View、计算子 View 的四个位置、设置子 View 的 4 个顶点。
  • onDraw(): 绘制父 View 本身的内容。
② 自定义属性
  • values 下面创建 xml 文件
  • 在自定义 View 的构造方法中加载 xml 文件
  • 布局文件中使用自定义属性
 
 

-----------------------------------

18
Android中事件分发机制
① 概念:对象是点击事件、本质是将点击事件传递到某个具体的 View 以及处理的过程,分发的过程就是事件传递的过程。
② 顺序:Activity --> ViewGroup --> View
③ 核心方法:
  • dispatchTouchEvent(): 分发点击事件
  • onTouchEvent(): 处理点击事件
  • onInterceptTouchEvent(): 判断是否拦截了某个事件
④ 过程
  • 首先到 Acvitity 的 dispatchTouchEvent(), 判断如果 ViewGroup.dispatchTouchEvent() 返回 true, 那么它也true。返回 false 则执行Activity.onTouchEvent()
  • 判断如果 ViewGroup.onInterceptTouchEvent() 返回 true,则自己处理,否则传递到子 View。
 
 

-----------------------------------

19
为什么主线程looper死循环不会导致ANR现象出现?
① Looper.loop() 的用途:是一个消息循环,如果没有这个消息循环,主线程运行完毕就会退出。
② 我们的代码就是在这个消息循环中执行的,因此就不会阻塞。只要消息循环没有阻塞,能一直处理事件,就不会产生 ANR。
 
 

-----------------------------------

20
Service如何执行一个耗时操作
继承 IntentService,重写 onHandleIntent 方法,就会在单独的线程中执行。
 
 

-----------------------------------

21
安卓的activity和application有什么区别
① Activity 和 Application 都是 Context 的子类,Context 管理上下文环境中的各个参数和变量。
② 虽然 Activity 和 Applicaiton 都是 Context 的子类,但是他们维护的生命周期不一样,前者维护一个 Acvitity 的生命周期,后者维护一个 Application 的生命周期。
 
 

-----------------------------------

22
fragment和activity有什么区别
① Activity 代表了一个屏幕的主体,Fragment 可以作为 Activity 的一个组成元素。
② Fragment 更加灵活,可以直接在 XML 文件中添加。
③ Fragment 可以灵活的替换一部分页面,Activity 不行。
 
 

-----------------------------------

23
安卓的activity和application有什么区别
① Activity 和 Application 都是 Context 的子类,Context 管理上下文环境中的各个参数和变量。
② 虽然 Activity 和 Applicaiton 都是 Context 的子类,但是他们维护的生命周期不一样,前者维护一个 Acvitity 的生命周期,后者维护一个 Application 的生命周期。
 
 

-----------------------------------

24
fragment和activity有什么区别
① Activity 代表了一个屏幕的主体,Fragment 可以作为 Activity 的一个组成元素。
② Fragment 更加灵活,可以直接在 XML 文件中添加。
③ Fragment 可以在一个界面上灵活的替换一部分页面,Activity 不行。
 
 

-----------------------------------

25
onStart和onResume的区别,分别是在什么时候调用的
  • onStart: 刚启动的时候调用一次,从后台回来的时候调用一次
  • onResume: 被一个 Dialog 覆盖后恢复可交互状态,从其他的 activity 返回。
 
 

-----------------------------------

26
activity启动模式
四种启动模式:
① 默认启动模式 standard: 启动的 Activity 会按顺序依次压入任务栈。
② 栈顶复用模式 singleTop: 如果栈顶 Activity 就是目标 Activity,则不会创建新的 Activity。
③ 栈内复用模式 singleTask: 如果栈内存在目标 Activity,则将目标 Activity 上方的所有 Activity 弹出,让目标 Acvitity 处于栈顶。
④ 全局唯一模式 singleInstance: 分配一个新的 affinity, 创建一个新的任务栈,然后将目标 Acvitity 放入新的任务栈,新的任务栈中只有这一个 Acvitity 实例。
 
 

-----------------------------------

27
多进程的几个activity依次启动。application只会被初始化一次吗
多进程启动,applicaiton 会初始化多次。可以通过 pid 解决,如果当前进程 id 不是主进程的 id,则直接 return。
 
 

-----------------------------------

28
a启动b 再返回生命周期。a启动b流程 为什么是先pause 等b展示完了再stop
① a 启动 b:a 先 onPause, 然后 b onCreate --> onStart --> onResume, 然后 a onStop
② 返回:b 先 onPause, 然后 a onRestart --> onStart --> onResume, 然后 b onStop --> onDestory.
一个活动是否 onStop, 取决于它是否可见。
先 pause 等 b 展示完了再 stop 的原因是,当 b 展示完后,a 才不可见,因此这时候才会调用 onStop.
 
 

-----------------------------------

29
内存泄露有哪些场景
在有向图中有通路和一个对象相连,但是以后不会使用到这个对象,就会发生内存泄漏。
常见的场景:
① 修改 HashSet 中对象 hashCode 有关的字段,会导致集合中无法删除这个对象。
② MVP 中,Activity 退出时,P 层中仍有 V 层的引用,导致 Activity 中的内存无法释放。
③ 外部类的一个实例的方法返回了内部类的一个对象,当这个外部类实例不再使用,但是内部类对象还在使用,会导致这个外部类对象无法被回收。
 
 

-----------------------------------

30
问怎么恢复activity状态 哪些方法 oncreate里面能恢复吗 和重写那俩方法恢复有什么区别
① 重写 onSaveInstanceState 方法,给 Bundle添加键值对。
② 重写 onResotreInstanceState 方法,调用 super 恢复状态
在 onCreate 也能恢复,区别是 onCreate 中需要判断 Bundle 是否为空。
 
 

-----------------------------------

31
RecyclerView机制 怎么区分不同类型的item的
RecylerView 机制
① 概念:RecyclerView 使用一个 Adaper 将数据按照一定的规则展示,Adapter 的工作是将数据转换成 RecylerView 认识的 ViewHolder。
② 缓存机制:Recycler 内部类,有五级缓存。
区分不同类型的 item
重写 getItemViewType() 方法,通过 position 拿到这个对象,判断它需要哪种视图,返回一个 int 类型的视图标志,然后在 onCreateViewHolder 方法中引入布局。
 
 

-----------------------------------

32
anr分类有哪些,原因,anr定位
分类
① 按键触摸超时: 5S
② 广播超时:10s
③ 服务超时:20s
定位
① Logcat 日志信息
② traces.txt 日志信息
 
 

-----------------------------------

33
android常见问题之卡顿原因与分析解决
卡顿原因
① 主线程进行了耗时操作如网络访问、大文件的读写操作.
② 频繁的gc引发卡顿
③ 死锁
④ view的绘制过于频繁,或者是嵌套过多
卡顿定位
① Logcat 日志信息
② traces.txt 日志信息
 
 

-----------------------------------

34
路由器在哪一层?常见的层都有哪些硬件设备?
路由器在网络层
① 物理层:中继器、集线器
② 数据链路层:网卡、网桥、交换机
③ 网络层:路由器、防火墙 
 
 

-----------------------------------

35
AsyncTask不同版本线程池的区别
① 3.0 以下:核心线程数 5 个,最大 128 个,阻塞队列容量 128
② 3.0-4.0, 核心 5 个,最大 128 个,阻塞队列容量 10
③ 4.4 以后:核心为 CPU_COUNT + 1,最大为 2 * CPU_COUNT + 1,阻塞队列容量 128
 
 

-----------------------------------

36
Android中的Context是什么?哪些实现?这些实现的区别?
① 自己的理解:就像拍电影,四大组件就是演员,Context 就是摄像机镜头。
② 源码注释:Context 是一个抽象类,提供了应用程序的全局信息。是一个统领应用程序环境变量的上下文。
③ 实现:实现 Context 的有:ContextImpl, ContextWrapper, 然后 ContextWrapper 下又有 Application, Service, ContextThemeWrapper, ContextThemeWrapper 下又有 Activity.
④ 实现的区别
  • ContextImpl 类真正实现了 Context 中所有的函数,我们所调用的各种Context类的方法均来自于该类。
  • ContextWrapper 里面有一个类型为 ContextImpl 的 mBase, 实现方法的时候调用了 mBase 的方法。
 
 

-----------------------------------

37
点击一个App图标的启动过程
① Launcher进程向system_server进程发起startActivity请求;
② system_server 进程向zygote进程发送创建进程的请求
③ zygote进程fork出新的App进程;
④ App 进程向system_server进程发起attachApplication请求
⑤ system_server进程准备好之后,向App进程发送 scheduleLaunchActivity 请求
⑥ App进程 通过handler向主线程发送LAUNCH_ACTIVITY消息
⑦ 主线程通过反射机制创建目标Activity,并回调Activity.onCreate()方法
 
 

-----------------------------------

38
View 是如何绘制的
测量、布局、绘制。
首先从 ViewRootImpl.performTraversals方法开始,分别调用performMeasure、performLayout、performDraw方法,从根View开始,然后一层一层传递下去,最终完成所有的测量布局绘制工作;
 
 

-----------------------------------

39
滑动冲突解决
① 外部解决:在父组件的 onInterceptTouchEvent 中,当横向的滑动距离大于纵向的滑动距离时,无需拦截此次滑动事件,滑动事件就会传递到下一层的 View
② 内部解决:在子组件中的onTouch方法中,调用getParent().requestDisallowInterceptTouchEvent()方法。
 
 

-----------------------------------

40
RxJava 原理
RxJava是流式编程,解决异步编程问题。
在每一条流中,都至少包含以下要素:
① 被订阅者,Observable或Flowable
② 订阅者,Observer或subscriber
③ 触发时机,subscribe()方法
④ 线程切换,subscribeOn()和observeOn()
⑤ 数据操作,如map()、flatMap()等
 
 

-----------------------------------

41
Retrofit 基本原理
① 概念:是一个对OKHttp框架的封装,采用注解方式开发,最终通过OKHttp框架进行发送。
② 原理:
- 通过动态代理的方式用MethodHandler完成接口方法。
- 通过RequestFactoryParser.parse解析,获得接口方法的参数和注解的值,传入到OkHttpCall,OkHttpCall 完成Http请求并使用Converter解析数据。
 
 

-----------------------------------

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
应用背景为变电站电力巡检,基于YOLO v4算法模型对常见电力巡检目标进行检测,并充分利用Ascend310提供的DVPP等硬件支持能力来完成流媒体的传输、处理等任务,并对系统性能做出一定的优化。.zip深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MichaelToLearn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值