精通安卓性能优化-第四章(五)

安卓ROM开发入门到精通 包含内容: 第一期主要为ROM开发,ROM定制技术资料,提供一些工具为主 ,让你学会简单做包,和基本的ROM DIY技巧,偶尔附加一些必要的教程。第二期针对ROM技术教程,细分知识点,重点剖析、解释,形成一系列的知识文档供查阅,目前大纲已列出,可以教你从零开始做包。 1.第一期---技术资料(维护更新): 更新日志: 1.书籍-Android系统级深入开发——移植与调试 2.开发工具-And... 阅读详情

引用

尽管释放内存是垃圾回收器的一个重要功能,它还可以做的更多,是一个完整的内存管理系统。每个写过Java代码的人都听过引用,一个对象怎样被引用或者不被引用。然而,很少有人知道引用的多种类型。实际上Java定义了4种类型的引用:
(1) Strong
(2) Soft
(3) Weak
(4) Phantom

Strong References

strong reference是Java开发者最熟悉的。创建这样一个引用在Java中随处可以看到,如Listing 4-18所示。实际上,他们是应用程序大多数时间使用到得。这里创建了两个strong reference,一个是Integer对象,另一个是BigInteger对象。

Listing 4-18 强引用

public void printTwoStrings (int n) {
    BigInteger bi = BigInteger.valueOf(n);  // 强引用
    Integer i = new Integer(n);   // 强引用

    System.out.println(i.toString());
    i = null;  // 新创建的Integer对象现在可以被GC回收

    System.out.println(bi.toString());
    bi = null; // BigInteger可能不可以被GC回收
}

这里需要注意的一个重要事情是当把i设为null使Integer对像对GC可消除,而bi设为null不一定。因为BigInteger.valueOf()方法可能会返回一个预分配的对象(比如,BigInteger.ZERO),设置bi为null仅仅移除了BigInteger的一个强引用,但是同样一个对象的更强的引用可能依然存在。这个方法中还创建了两个strong reference,它们可能不如其他的明显:i.toString()的调用和bi.toString()的调用,每个都创建了String对象的强引用。

NOTE:严格的说,你需要知道Integer构造器的实现,保证没有其他strong reference指向新创建的Integer对象,这样保证设置i为null使得对象对GC来说是可消除的。

就像之前讨论的,保持对象的strong reference可能会导致内存泄露。我们已经合适的使用“strong reference”许多次,现在是时间去说Java不是定义了这么一个短语或者类。strong reference是“正常”的引用,被简单的叫做引用。

Soft, Weak, and Phantom References

Soft和weak reference在本质上是相似的,它们是不足以保持一个对象不被删除或者回收的引用。它们的不同在于GC尝试回收它们的程度。
一个对象是softly reachable,即存在一个soft引用而不是Strong引用,如果还有足够的空间去保持这个对象,当GC发生时会被留下。然而,如果GC决定需要回收更多的内存,它可以去回收soft reachable对象。这种类型的引用是cache首选的,可以自动的移除它的entry。

TIP:当使用一个cache,保证你理解它使用什么样的引用。比如,Android的LRUCache使用strong reference。

Weakly reachable对象,即一个对象存在一个weak引用而不是strong或者soft引用,可能在下次GC的时候立即被回收。换句话说,GC将更加侵略性的去回收weakly reachable对象。这个类型的引用是mappings的候选,当key不再被引用的时候,可以被自动的移除。WeakHashMap类就是为了这个目的。

NOTE:GC有多大的侵略性依赖于实际的实现。

Phantom引用是最弱的引用,很少被使用到。当你的应用需要知道一个对象什么时候被回收,需要在那个时间点执行一些清理,它是有用的。要确实有用的话,phantom引用需要被注册一个引用队列。
Soft,weak, phantom引用本身是实际的对象,提供其他对象的一个指向。比如,你可以创建一个phantom引用到一个soft引用到一个weak引用。实际上,你经常创建soft, weak, phantom应用到"strong"引用。Listing4-19给出了一个soft和weak引用的示例,每个联系着一个不同的引用队列。

Listing 4-19 引用和引用队列

private Integer strongRef;
private SoftReference<Integer> softRef;
private WeakReference<Integer> weakRef;
private ReferenceQueue<Integer> softRefQueue = new ReferenceQueue<Integer>();
private ReferenceQueue<Integer> weakRefQueue = new ReferenceQueue<Integer>();

public void reset () {
    strongRef = new Integer(1);
    softRef = new SoftReference<Integer>(strongRef, softRefQueue);
    weakRef = new WeakReference<Integer>(strongRef, weakRefQueue);
}

public void clearStrong () {
    strongRef = null; // 没有了strong引用,但是weak和soft引用可能依然存在
}

public void clearSoft () {
    softRef = null;  // 没有了soft引用,但是strong和weak引用可能仍然存在
}

public void clearWeak () {
    weakRef = null;   // 没有了weak引用,但是strong和soft引用可能仍然存在
}

public void pollAndPrint() {
    Reference<? extends Integer> r;
    if ((r = softRefQueue.poll) != null) {
        do {
            Log.i(TAG, "Soft reference: " + r);
        } while ((r = softRefQueue.poll()) != null);
    } else {
        Log.i(TAG, "Soft reference queue empty");
    }

    if ((r == weakRefQueue.poll()) != null) {
        do {
            Log.i(TAG, "Weak reference: " + r);
        } while ((r = weakRefQueue.poll()) != null);
    } else {
        Log.i(TAG, "Weak reference queue empty");
    }
}

public void gc () {
    System.gc();
}

这段代码为了看引用什么时候进入队列,这将怎么影响你的应用。要完全利用GC的内存管理能力,利用回收器内存管理的优势,理解引用很重要。当使用cache或者map的时候,你不需要尝试去实现一个相似的内存管理系统,。你想去达到的大多数数目标可能只需要认真的去使用垃圾回收器。

Garbage Collection

垃圾回收可以发生在不同的时间,当它发生的时候,你几乎无法控制。你可以通过调用System.gc()给Android一些暗示,但是最终Dalvik虚拟机决定gc实际发生的时间。五种情况促使gc发生,我将通过他们的Log信息提到他们,你可以通过logcat看到:
(1) GC_FOR_MALLOC:发生在当Heap不足以分配内存的时候,在内存分配可以被执行之前内存必须被回收
(2) GC_CONCURRENT: 当一个collection kicks in(可能是部分), 存在足够被回收的对象
(3) GC_EXPLICIT:当你调用System.gc()去显式的请求垃圾回收
(4) GC_EXTERNAL_ALLOC:在Honeycomb或者之后不会再发生(所有的东西会在heap分配)
(5) GC_HPROF_DUMP_HEAP:当创建一个HPROF文件的时候发生

Listing 4-20给出一些垃圾回收器的Log信息。

Listing 4-20 垃圾回收信息

GC_CONCURRENT freed 103K, 69% free 320K/1024K, external OK/OK, paused 1ms+1ms GC_EXPLICIT freed 2k, 55% free 2532K/5511K, external 1625K/2137K, paused 55ms

因为GC需要时间,减少你分配后马上释放的对象的数量可以提升性能。特别是在Android 2.2和更早的版本,因为GC发生在应用程序的主线程,可能导致严重的响应和性能问题。比如,实时游戏的一些帧可能会丢失,因为太多的时间用来做GC。从Android 2.3开始变得好起来,因为大多数的GC在一个单独的线程。GC发生的时候,仍然会影响主线程(5毫秒的暂停或者更少),但是比之前的Android版本少很多。一个完整的GC需要50毫秒是很正常的。供参考,一个30帧每秒的游戏需要33毫秒去渲染和显示每一帧,所以很容易可以看到为什么在Android 2.3之前的版本可能会出现问题。

APIS

安卓定义了几个API,可以用来去了解系统上多少内存是可用的,已经使用了多少:
(1) ActivityManager的getMemoryInfo()
(2) ActivityManager的getMemoryClass()
(3) ActivityManager的getLargeMemoryClass()
(4) Debug的dumpHprofData()
(5) Debug的getMemoryInfo()
(6) Debug的getNativeHeapAllocatedSize()
(7) Debug的getNativeHeapSize()

TIP: 在应用的manifest文件设置android:largeHeap为true,表示要使用大的heap。这个属性在Android 3.0引入。不能保证large heap会比regular heap大。你需要尽量去防止应用依赖于这个设置。

Listing 4-21给出了如何去使用两个getMemoryInfo()方法。

Listing 4-21 调用getMemoryInfo()

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo();
am.getMemoryInfo(memInfo);
// 使用memInfo的信息

Debub.MemoryInfo debugMemInfo = new Debug.MemoryInfo();
Debug.getMemoryInfo(debugMemInfo);
// 使用debugMemInfo信息

Low Memory

你的应用不是孤立的。它需要去和许多其他的应用还有系统共享资源。结果,很多时候会存在没有足够的内存给每个应用,Android会要求应用和他的组件(比如Activity或者Fragement)去系紧他们的腰带。
CompoCallbacks接口定义了onLowMemory() API,对所有的应用组件是通用的。当它被调用,通常要求去释放组件不实际需要的对象。通常,onLowMemory()的实现将释放:
(1) Caches或者Cache entries(比如,LruCache因为它使用强引用)
(2) 可以在有需求的时候重新产生的Bitmap对象
(3) 看不到的Layout
(4) 数据库对象
需要注意重建对象耗时的。然而,不释放足够的内存可能导致安卓去杀掉进程,甚至你的应用。如果应用被杀掉,下次用户希望使用的时候需要从头开始启动。这样,你的应用需要释放尽量多的资源,因为不止有利于其他的应用同样还有本身。在你的代码中使用lazy初始化一是个好的习惯:允许你稍后实现onLowMemory()而不需要去修改其他代码。

Summary

在嵌入式设备中,内存是稀缺资源。尽管现在的手机和平板有越来越多的内存,这些设备同样运行越来越复杂的系统和应用。有效的使用内存不止可以允许你的应用运行在老的设备上,同样可以运行更快。记住,如果你给应用内存,他将要求更多。

Android开发初期之后怎么提升?怎么才能叫精通?方向在哪? 1. Android开发初期之后怎么提升? 首先第一个问题:Android开发初期之后怎么提升?说到这个问题,就不得不先搞清楚 “为什么很多人会一直停留在两三年的水平上,而后一直在重复以往的经验,原地踏步?” 我认为最主要的一个原因就是这部分开发者缺乏主观能动性,或者说缺乏能支撑你坚持学习的兴趣。如果你对Android开发没有太大的兴趣,那么还是尽早换方向吧。有了兴趣,然后就是要有一个比较正确的钻研路线,不要这也搞那也抓,最后什么都知道点,但也就只是知道点儿。 一个很好的例子就是我们平时在开发过程中都会用 阅读详情

相关推荐

Android/JAVA性能优化:从入门到精通(万字讲解!!!)

在当今快速发展的移动应用市场中,用户体验是决定应用成功与否的关键因素之一。无论是在Android还是其他平台上,应用的性能表现直接影响用户的满意度和应用的市场竞争力。作为开发者,掌握Java性能优化的技巧不仅能够提升应用的流畅度,还能延长应用的生命周期,从而在激烈的市场竞争中脱颖而出。本文将从内存管理、线程与并发、代码优化、网络优化、数据库优化等多个方面,深入探讨Java性能优化的策略和技巧,帮助开发者在实际开发中提升应用性能,优化用户体验。提示:以下是本篇文章正文内容,下面案例可供参考。

学无止境 1222

电梯模拟项目实战:从单梯调度到多梯群控的完整解析

在复杂系统仿真中,状态机和事件驱动是构建可扩展模拟骨架的基础。电梯模拟正是典型代表,其核心不在于界面渲染,而在于请求队列、方向决策和多梯协调。采用LOOK/SCAN算法可避免电梯来回绕路,通过最小预估等待或最短距离策略实现多梯分单。借助时间步进机制和统计指标(如平均等待时间、空驶率),能验证调度优劣并持续优化。这类技术广泛用于课程设计、调度算法练习以及电梯群控等实时系统原型。本文以一个迭代到第七版的电梯模拟项目为样本,完整拆解从状态建模、单梯调度到多梯群控的演进过程。

weixin_33860528的博客 412

从零到精通:Android开发学习路径全解析

Android开发作为移动互联网核心技术之一,其技术栈经历了从基础SDK到现代架构的演进。理解Android系统架构需要扎实的Java/Kotlin基础,掌握Activity生命周期、UI组件等核心概念。在进阶阶段,开发者需要关注性能优化、架构设计等关键技术,如内存管理、MVVM模式实现等。通过项目实践和源码阅读,开发者可以深入理解Binder机制、AMS等底层原理。本文以知名博主stormzhang的学习路径为例,系统梳理了从Java基础到Flutter跨平台的完整学习框架,为移动开发者提供了一条清晰的技

weixin_34326558的博客 268

Android从入门到精通

全书共分15章,内容包括Android快速入门、Android模拟器与常用命令、用户界面设计、高级用户界面设计、基本程序单元Activity、Android应用核心Intent、Android事件处理、资源访问、图形图像处理技术、多媒体应用开发、Content Provider实现数据共享线程与消息处理、Service应用、网络编程及Internet应用和基于Android的家庭理财通。[Android.游戏开发入门](美)Mario.Zechner.插图版.pdf。

github_38514857的博客 878

android游戏开发从入门到精通,androidstudio插件开发

如果基础知识有太多不会的就危险了,必须好好准备,这是躲不过的。这个阶段有不会的很正常,因为对方正在确定你的水平,但态度一定要积极主动,即使之前没有研究过,也要结合一些经验说出推测的结果,切忌直接说“我不会”。我只贴上我写过内容的链接,剩下的朋友们去网上一搜,或者去买本书看下就好了,建议看 《Java 编程思想》,不仅解答了 What 还有探讨 Why。我这次面试算法问的比较少,只手写过插入排序,建议把冒泡、插入、归并时间复杂度和实现熟悉熟悉,最好手写下,不然现场手写的时候容易出错。

2401_84408418的博客 1419

android开发从入门到精通pdf下载,系列教学

如果你觉得这些内容对你有帮助,可以扫码领取!!!!

2301_82241859的博客 1306

精通 Kotlin 安卓开发(五)

在这一简短但重要的章节中,我们强调了关于维护和实现良好应用性能和响应能力的重要要点。这些建议在应用程序优化中至关重要。因此,如果您的应用程序不遵循这些规则,您必须相应地进行优化。通过完成这一章,我们涵盖了您开发 Android 应用程序所需的一切。在下一章中,我们将对其进行测试。准备好编写一些单元测试和仪器测试!在本章中,我们学习了如何为我们的应用程序编写和运行测试。这是迈向生产的又一步。我们建立了一个书写良好且无 bug 的产品。很快,我们将实际发布它。请耐心等待,因为那一刻即将到来!

龙哥盟 652

Android面试指南与参考答案——基于领星安卓开发职位要求

本文基于领星安卓开发职位要求,整理Android开发岗位常见面试问题与参考答案。核心内容包括:1.基础知识:Android四层架构、SDK组件及API使用;2.编程语言:Kotlin优势、Jetpack组件应用及MVVM/MVP架构对比;3.开发工具:性能优化方法及版本适配策略;4.实战经验:第三方SDK集成和APP发布流程。针对1-3年经验者及应届生,提供代码示例和项目实例说明,覆盖框架搭建、性能优化等关键技术点,帮助候选人系统准备面试,突出技术能力和问题解决思维。

郑伟强dev的专栏 1192

想学Android开发,是否必须精通Java?

想学Android开发,必然需要先精通Java,其次c++,再后面是kotlin,基本代码上系统源码framework层面都是java和c++,基本上找不到任何kotlin,源码中只有几个简单app使用是kotlin。在这里,我为大家整理了一些列Android学习资料,有需要的朋友可以扫描下方二维码,获取更多相关资料。

Eqiqi的博客 1988

MOOS-ivp 实验三 MOOS简介(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例

weixin_44151170的博客 7434

android性能优化从入门到精通

什么是性能优化 一款app除了要有强大的功能和交互外,在性能上也应该追求更高的要求,这样才能更好的提高用户体验 优化目的 性能指标 优化的方向 更快 流畅性 启动速度页面响应速度响应速度 更稳定 稳定性 避免出现应用崩溃(crash)避免出现应用无响应(ANR) 更省 资源节省性 内存大小安装包大小耗电量网络流量 优化详解 速度优化 内存优化 数据结构优化:数据结...

qq_23081779的博客 1765

别再只放按钮了!巧用微信小程序‘长按识别’功能,打造无缝加群体验

本文深入探讨了微信小程序'长按识别'功能在社群运营中的创新应用,通过简化加群流程至一步操作,显著提升用户转化率。文章详细解析了技术实现细节、UI/UX设计策略,并对比了与企业微信API的适用场景,为开发者提供打造无缝加群体验的完整解决方案。

weixin_42627853的博客 434

Android性能优化:从入门到精通

本文从基础知识、优化方法和实战案例分析三个方面,详细介绍了Android性能优化的方法和技巧。性能优化是Android开发中不可或缺的一部分,对提升用户体验具有重要意义。开发者应掌握性能优化的基础知识,合理运用优化方法,以实现应用的高性能表现。未来,随着移动设备的性能不断提升,性能优化将更加重要。开发者需要关注新的优化技术和工具,不断更新优化策略,以满足用户对高性能应用的需求。同时,性能优化也需要与用户需求相结合,避免过度优化,确保应用的平衡发展。持续关注新技术。

2501_92486623的博客 357

SOLIDWORKS无法获得下列许可 无效的使用许可号码(-8,544,0) 解决办法大全

SOLIDWORKS无法获得下列许可 无效的使用许可号码(-8,544,0) 解决办法大全。版本:SolidWorks2021。电脑:惠普战66四代。软件安装不困难!

qq_43596278的博客 11万+

摄像机实时接入分析平台视频分析网关AI智能分析智慧营业厅方案

通过智能化的改造,可以提高营业厅的运营效率,降低运营成本,同时提升客户体验和安全保障。

EasyDarwin开源社区技术博客 703

QtScrcpy安卓投屏完整攻略:从入门到精通

还在为手机屏幕太小而烦恼吗?想要在大屏幕上畅玩手游却不知从何下手?QtScrcpy这款开源安卓投屏工具正是你需要的解决方案!它能将手机屏幕实时投射到电脑,支持键盘鼠标操作,让你彻底告别触摸屏的局限。 ## 🎯 为什么选择QtScrcpy? **传统投屏痛点**: - 连接复杂,步骤繁琐 - 延迟高,画面卡顿 - 不支持键鼠操作 - 无法多设备管理 **QtScrcpy优势对比**: ✅ *

gitblog_00510的博客 3万+

52-Halcon-- smooth_object_model_3d函数功能(滑处理3D对象模型)

Halcon中smooth_object_model_3d算子详解 该算子用于3D模型平滑处理,提供三种算法:'laplacian'(快速去噪)、'taubin'(高质量防收缩)和'low_pass'(频域滤波)。核心参数包括迭代次数(默认5)、平滑强度(0-1)和边缘保护选项。典型应用包括扫描数据去噪、CAD模型光顺和逆向工程优化。支持自适应平滑、结合模型简化等高级技巧,并可通过分块处理优化大型模型性能。参数组合需根据具体场景选择,如快速去噪推荐拉普拉斯方法(5次迭代,强度0.3),特征保持推荐低通滤波(

weixin_45590420的博客 871

Android面试官:你究竟有多大的勇气,在简历上写了“精通”?

自定义 View 可以让我们产生更好的效果,app UI 美观,交互界面友好,用户青睐,用户留存率高,这就是app成功的第一步了。高级UI与自定义View有着不可分割的联系。自定义View其实并不难,为什么呢?因为自定义View无非就是显示+交互:显示由 onMeasure ->onLayout->onDraw的整个流程就将显示整个流程处理完了,而交互则是touch事件的处理;另外其他的一切你比如Canvas,Animation,Paint都是围绕着draw来进行的,所以我们需要搞懂其中的根本原理。

the shy 127

华为HCIP的学习大纲和计划

HCIP(华为认证 ICT 高级工程师)核心围绕华为 ICT 技术体系,不同方向(如路由交换、云计算、安全等)课程目录不同,以下是最热门的。

迷逝 573

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

零基础玩转Windows Subsystem for Android:从安装到精通的实用指南

Windows Subsystem for Android(简称WSA)是微软推出的革命性功能,它就像在Windows 11系统中搭建了一座通往Android世界的桥梁????,让你的电脑无需复杂配置就能直接运行手机应用。想象一下,你可以在电脑上刷短视频、使用生产力APP,甚至畅玩安卓游戏,所有操作都在熟悉的Windows环境中完成。对于开发者而言,这更是测试安卓应用的利器;对于普通用户,它则打破了设...

gitblog_01031的博客 1645

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

3分钟精通安卓虚拟相机:从零配置到多场景实战

想要在安卓设备上实现摄像头内容的灵活替换吗?VCAM虚拟相机为您提供了完美的解决方案。这款基于Xposed框架的安卓虚拟相机支持安卓5.0及以上系统,能够为直播、视频会议、隐私保护等场景创建虚拟摄像头接口,让您的手机摄像体验更加丰富多彩! ## 🎯 基础入门:环境准备与快速启动 ### 必备条件清单 在开始使用VCAM虚拟相机前,请确保您的设备满足以下基本要求: - ✅ 已安装Xposed

gitblog_00738的博客 666

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Windows 11安卓子系统终极安装指南:从零到精通完整教程

想要在Windows 11上完美运行Android应用吗?WSA-Script项目为你提供了终极解决方案!这个开源项目能够将Magisk root权限和Google Play服务集成到Windows Subsystem for Android™中,让你在PC上获得完整的Android体验。🚀 ## 🔧 准备工作:系统要求检查 在开始安装Windows安卓子系统之前,请确保你的系统满足以下要

gitblog_00491的博客 1005

Scrcpy安卓投屏终极指南:从零到精通的完整教程

你是否曾经需要在电脑上操作安卓设备,却苦于找不到合适的工具?Scrcpy作为一款专业的安卓投屏解决方案,能够完美解决这一痛点。本指南将带你深入理解Scrcpy的核心机制,掌握从基础连接到高级优化的全套技能。 ## 问题诊断:为什么你需要Scrcpy? 在深入技术细节之前,让我们先明确Scrcpy能够解决哪些实际问题。 **使用前 vs 使用后对比分析:** | 场景 | 传统方式痛点 |

gitblog_00660的博客 1060

安卓虚拟相机VCAM完全配置手册:从入门到精通

安卓虚拟相机VCAM是一款革命性的开源工具,专为需要灵活控制摄像头输出的用户设计。通过Xposed框架的支持,这款虚拟摄像头能够在安卓5.0及以上系统中完美运行,为直播、视频会议、隐私保护等场景提供强大的视频流替换能力。 ## 🎯 环境准备与系统要求 ### 硬件与软件兼容性检查 在开始安装之前,请确保您的设备满足以下核心要求: | 检查项目 | 最低要求 | 推荐配置 | |-----

gitblog_01058的博客 626
上一篇: 精通安卓性能优化-第四章(四)
下一篇: 精通安卓性能优化-第五章(一)
北冥_有鱼
博客等级 码龄19年 14粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值