Android工程师面试题大全

【新手必看】蓝牙的HOGP和HID、GATT有什么区别和联系 让新手宏观了解蓝牙HOGP、HID、GATT这三个协议的区别和联系 阅读详情

Java基础:

1、内存泄露的原因:

  1. 资源对象没关闭。
    如Cursor、File等资源。他们会在finalize中关闭,但这样效率太低。容易造成内存泄露。
    SQLiteCursor,当数据量大的时候容易泄露
  2. 使用Adapter时,没有使用系统缓存的converView。
  3. 即时调用recycle()释放不再使用的Bitmap。
    适当降低Bitmap的采样率,如:

    BitmapFactory.Options options = newBitmapFactory.Options();    
    options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一    
    Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);
  4. 使用application的context来替代activity相关的context。
    尽量避免activity的context在自己的范围外被使用,这样会导致activity无法释放。
  5. 注册没取消造成内存泄露
    如:广播
  6. 集合中的对象没清理造成的内存泄露我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
  7. Handler应该申明为静态对象, 并在其内部类中保存一个对外部类的弱引用。如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static class MyHandler  extends Handler
{
        WeakReference<Activity > mActivityReference;
        MyHandler(Activity activity)
       {
             mActivityReference=  new WeakReference<Activity>(activity);
       }
      @Override
      public void handleMessage(Message msg)
     {
            final Activity activity = mActivityReference.get();
            if (activity !=  null )
           {
                  mImageView.setImageBitmap(mBitmap);
           }
      }
}

2、ArrayList和LinkedList的区别

  • ArrayList初试大小为10,大小不够会调用grow扩容:length = length + (length >> 1)
  • LinkedList中Node first,last。分别指向头尾

ArrayList和LinkedList在性能上各 有优缺点,都有各自所适用的地方,总的说来可以描述如下:

  1. 对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对 ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。
  2. 在ArrayList的 中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
  3. LinkedList不 支持高效的随机元素访问。
  4. ArrayList的空 间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
    可以这样说:当操作是在一列 数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中 间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。

3、hashmap和hashtable的不同

  1. 继承不同。
    public class Hashtable extends Dictionary implements Map
    public class HashMap extends AbstractMap implements Map
  2. Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
  3. Hashtable中,key和value都不允许出现null值。
    在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
  4. 两个遍历方式的内部实现上不同。
    Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
  5. 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
    6.Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

4、Iterator和Enumeration的不同

  1. 函数接口不同
    Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。 Iterator只有3个函数接口。Iterator除了能读取集合的数据之外,也能数据进行删除操作。
  2. Iterator支持fail-fast机制,而Enumeration不支持。 Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、Hashtable实现Enumeration时,添加了同步。而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

ail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

5、接口的注意点

  1. 接口中的字段全部默认为 public static类型。
  2. 接口中的方法全部默认为 public类型。
  3. 接口中可以申明内部类,而默认为public static,正因为是static,只是命名空间属于接口,代码逻辑不属于接口。所以不违法接口定义。
  4. 接口本身可以申明为public或者缺省。
  5. 抽象类继承自某接口。如果在抽象类中实现了父类(接口)中的方法,在其子类可以不用实现,否则在子类必须实现。

6、final方法

将方法声明为final那有两个原因,第一就是说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。第二就是允许编译器将所有对此方法的调用转化为inline调用的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。

Android知识点

1、Handler机制

  1. Handler对Activity finish影响。
    在开发的过程中碰到一个棘手的问题,调用Activity.finish函数Acitivity没有执行生命周期的ondestory函数,后面查找半天是因为有一个handler成员,因为它有一个delay消息没有处理,调用Activity.finish,Activity不会马上destory,所以记得在Ativity finish前清理一下handle中的未处理的消息,这样Activity才会顺利的destory
  2. Looper
    通过调用Looper.prepare()创建Looper()对象并绑定到ThreadLocal变量中。
    Looper里面包含了messageQueue。
    构造器如下:

    private Looper()
    {
         mQueue = new MessageQueue();
         mRun = true;
         mThread = Thread.currentThread();
    }
  3. loop()函数
    1)从Looper中取出MessageQueue;
    2)循环从MessageQueue中取出Message;
    3)从Message中取出Target(Handler对象);
    4)调用tartget的dispatchMessage分发消息。
  4. Handler对象
    重要成员变量:

    final MessageQueue mQueue;
    final Looper  mLooper;
    final Callback mCallback;   //用于回调

    Handler对象在发送消息的时候,将MSG的target变量设为自己。这样在Looper对象循环取出msg的时候就可以调用对应handler的dispatchMessage()。此函数分发消息的优先级如下:
    Message在创建的时候调用Obtain设置了Callback。
    Handler在创建的时候传入了Callback。
    交给Handler子类的HandleMessage处理(通常的做法)。

2、Android启动模式

standard和singleTop模式。

这两种比较简单。创建Activity放入当前的任务栈中,若当前是singleInstace,则放入设置的任务栈中。其中如果Activity在栈顶,则调用onNewIntent。

singletask:栈内复用模式。不是在当前任务栈中查找是否存在,实际过程如下:

  1. 查找该Activity所需的任务栈是否存在(由taskAffinity控制,或者默认为包名)。
  2. 在任务栈当中查找该Activity是否存在。
    这里面存在任务栈的切换,也就是当开启的singtask类型的Activity不属于当前任务栈时,则会切换到其任务栈。

singleInstance:单实例模式。

包含了singleTask的所有特性,另外加上:设置为该模式的Activity,只能单独存在于一个任务栈中。当有两个singleInstace的Activity设置成同样的任务栈时,会出现两个同名的任务栈,分别用来存放同名的Activity。

注:在任何跳转的时候,首先调用本Activity的onPause,然后跳转。如果被跳转的activity由于启动方式而没创建新的实例,则会先调用onNewIntent,然后按照正常的生命周期调用。

如

1:A→B,A:onPause;B:onCreate,onStart,onResume。

2:A(singleTop)→A,A:onPause;A:onSaveInstanceState;A:onResume。

3、View的绘制

推荐郭霖大神的博客:

http://blog.youkuaiyun.com/guolin_blog/article/details/16330267

4、canvas的使用

推荐以下博客:

http://blog.youkuaiyun.com/qinjuning/article/details/6936783

5、ActivityManagerService的相关知识点

推荐以下博客:

http://wiki.jikexueyuan.com/project/deep-android-v2/activity.html


6、Activity切换时生命周期交集

Activity之间的协作当一个activity A启动了另外一个activity B,它们的生命周期是有交叉的;

首先A的onPause()被调用;

之后B的onCrate(), onStart()及onResume() 方法会被调用(此时B拥有用户焦点);

最后,如果A在屏幕上不可见,onStop()方法被调用;

因此,我们在两个activities中传递数据,或者共享资源时(如数据库连接),需要在前一个activity的onPause()方法而不是onStop()方法中进行;

7、Hybrid(重要加分项)

  1. java和JS的交互
    http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/
    http://rensanning.iteye.com/blog/2043049
  2. WebView开启JavaScript脚本执行
  3. WebView设置供JavaScript调用的交互接口。

8、网络编程

  1. volley
    https://bxbxbai.github.io/2014/09/14/android-working-with-volley/
    http://blog.youkuaiyun.com/guolin_blog/article/details/17656437
  2. 如何控制TCP连接时的拥塞
    http://blog.youkuaiyun.com/yechaodechuntian/article/details/25429143
  3. 三次握手
    http://blog.youkuaiyun.com/whuslei/article/details/6667471
  4. Android客户端和服务端如何使用Token和Session
    http://wyong.blog.51cto.com/1115465/1553352
  5. 移动端获取网络数据优化的几个点
    1. 连接复用 :
      节省连接建立时间,如开启 keep-alive。
      对于 Android 来说默认情况下 HttpURLConnection 和 HttpClient 都开启了 keep-alive。只是 2.2 之前 HttpURLConnection 存在影响连接池的 Bug,具体可见:Android HttpURLConnection 及 HttpClient 选择
    2. 请求合并:
      即将多个请求合并为一个进行请求,比较常见的就是网页中的 CSS Image Sprites。如果某个页面内请求过多,也可以考虑做一定的请求合并。
    3. 减少请求数据的大小:
      对于post请求,body可以做gzip压缩的,header也可以作数据压缩(不过只支持http 2.0)。
    4. 返回的数据的body也可以作gzip压缩,body数据体积可以缩小到原来的30%左右。(也可以考虑压缩返回的json数据的key数据的体积,尤其是针对返回数据格式变化不大的情况,支付宝聊天返回的数据用到了)
    5. 根据用户的当前的网络质量来判断下载什么质量的图片(电商用的比较多)。

9、android开发中,可能会导致内存泄露的问题

  1. 不要让生命周期长于Activity的对象持有到Activity的引用
  2. 尽量使用Application的Context而不是Activity的Context
  3. 尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用(具体可以查看细话Java:”失效”的private修饰符了解)。如果使用静态内部类,将外部实例引用作为弱引用持有。
  4. 垃圾回收不能解决内存泄露,了解Android中垃圾回收机制
    **更多内容可以参考以下博客:
    http://spencer-dev.lofter.com/post/d7b9e_6faf120

10、activity的启动过程:

http://www.cloudchou.com/android/post-788.html

以上是我遇到和搜集到的各类题目以及相应的解答,接下来一段时间也会持续更新,大家遇到什么经典或者不会的问题也可以给我留言,在此统一分享给大家。祝大家能够找到自己心仪的工作,前途一片光明!

文/超低空(简书作者)
原文链接:http://www.jianshu.com/p/1bdf7d0e1ac5
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

转载请注明:Android开发中文站 » Android工程师面试题大全


会计-合并-5- 增资、处置交易在合报与个报会计处理 摘要:本文系统梳理了股权投资会计处理的四种情形:从交易性金融资产转为权益法或成本法、权益法转成本法、权益法增持。核心原则是区分个报与合报处理,重点关注原投资公允/账面价值的计量差异及损益确认逻辑。对不丧失控制权的股权处置,个报确认投资收益,合报调整资本公积;丧失控制权时,个报需追溯调整权益法核算,合报计算综合投资收益。一揽子交易的特殊处理强调将过渡性差额暂记其他综合收益,最终丧失控制权时转入当期损益。文末通过典型案例演示了不同情境下的具体计算方法。 阅读详情

相关推荐

SAP ABAP开发避坑:BAPI_MATVAL_PRICE_CHANGE调用报‘估价未维护’的完整解决流程

本文深入解析SAP ABAP开发中调用BAPI_MATVAL_PRICE_CHANGE函数时遇到的'估价未维护'错误,提供从基础配置检查到CKML_PRICE_SEND表维护的完整解决方案。通过实战案例和代码示例,帮助开发者快速定位问题并实现批量价格更新的自动化处理,提升开发效率。

weixin_28705087的博客 428

2023年Android中高级最全面试题(含大厂原题+解析)

又到了一年一度的金三银四黄金跳槽时节,也是互联网大厂疯狂招人的时期,现在应该有很多Android程序员已经按耐不住了。但是现在网上的面试题资料太多了,而且有些面试题已经过时甚至是漏洞百出。今天结合自己前段时间的面试经历和几位大厂大佬交流讨论总结出这份2023年Android中高级最全面试题来帮助大家轻松搞定offer。话不多说,直接上干货!!!希望这份面试题,能帮助大家把握住机会,找到自己心仪的工作!!

star_nwe的博客 4827

基于立创EDA的8口全千兆POE交换机设计详解:RTL8370N芯片与90W大功率供电方案

本文详细解析了基于立创EDA设计的8口全千兆POE交换机方案,核心采用RTL8370N交换芯片与支持90W大功率供电的IEEE 802.3bt标准PD芯片。文章深入探讨了PSE/PD供电管理、电源架构设计、电路细节及关键散热方案,为DIY或学习POE交换机硬件设计提供了完整的开源实践指南。

weixin_29050829的博客 1万+

安卓安全/逆向面试题

安全、逆向

平凡者的专栏 5205

SwinTransformer 改进:SSPCAB模块(2024最新改进方法)

SSPCAB(Spatial Pyramid Pooling with Channel Attention Block)是2024年提出的一种新型神经网络架构改进方法,专注于在保持高精度的同时显著降低计算复杂度和参数量。该方法通过创新的空间金字塔池化与通道注意力机制的结合,实现了网络结构的紧凑化和运算效率的大幅提升。核心创新点1. 混合空间金字塔池化(Hybrid Spatial Pyramid Pooling, HSPP)多尺度动态核池化:根据输入特征图尺寸动态调整池化核大小和步长交叉级联结构。

Henry的博客 1311

Ubuntu零基础教学-史上最详Ubuntu20.04安装教程,超级详细,强烈建议收藏!

官网地址:https://www.vmware.com/ 1、VMware Workstation Pro 15.5.1在Windows 10的安装不再介绍了,一路下一步即可。 2、下面详细介绍在VMware 虚拟机里安装Ubuntu 20.04 LTS的步骤

**My Coding Family** 2万+

一些关于逆向的面试题

假设你被要求分析一个未知的二进制文件,描述你的分析步骤。如何判断一个程序是否被加壳了?如果加壳了,如何脱壳?反编译得到的代码是否可以直接用于修改和重新编译程序?解释一下机器码、汇编语言和高级语言之间的关系。解释一下栈帧的概念以及在逆向分析中的作用。在软件安全领域,逆向工程可以用于哪些方面?如何识别一个程序中的关键函数或代码段?反编译和反汇编有什么区别?常见的逆向工具有哪些?

m0_57836225的博客 1341

【100%通过率】华为OD机试真题 JS 实现【水库蓄水问题】【2023 Q1 | 100分】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 8174

逆向面试常见问题(陆续更新ing)

资料收集与网络(点击对应标题有原帖地址)PE怎么判断PE是DLL,还是EXE文件值属性加载基址怎么判断PE文件是32位还是64位PE加载过程基础Windows下的调用约定通用寄存器有哪些?段存器怎么找到函数地址调试与反调试INT3INT 3 指令Intel的手册INT 3 中断调试处理流程Windows反调试有哪些?反调试技术总结一、探测Windows调试器1.使用Windows API2.手动检...

JiangBuLiu的博客 8021

互联网的发展简史—web

互联网是我现在生活所离不开的一个东西,但是你知道互联网的前世今生吗?本文将讲解互联网的发展史,以及很火的元宇宙概念。

yj11290301的博客 3565

环保 HJ212协议解析

由于是做环保相关的,有时需要对212协议进行拆包和解包。HJ212协议是一种字符串协议,数据传输通讯包主要由包头、数据段长度、数据段、CRC校验、包尾组成,其中“数据段”内容包括请求编码、系统编码、命令编码、密码、设备唯一标识、总包数、包号、指令参数。请求编码为请求的时间戳,系统编码ST统一规定为22,命令编码CN为该数据包的时间类型,访问密码、设备唯一标识在对接时由平台提供,指令参数为数据内容。通讯协议的数据结构如图4所示。 图4 通讯协议的数据结构 6.1.1通讯包结构组成 名称 类型 长度

ccf19881030的专栏 2万+

安卓开发不得不会!一线互联网企业高级Android工程师面试题大全,Android篇

行业激烈变化时,恰恰是机会最多的时候 坦白讲,许多人骨子里害怕变化和竞争。 其实大可不必。 一来,怕也没用嘛。二来,变化越快,组合要素增加了,意味着新的工作机会越多。 就像传统媒体VS新媒体。 放在10年前连“新媒体”这三个字都没问世,可如今已成为360°覆盖人们的事物。曾经从事纸媒行业的人,开始新模式转型;曾经写书写博客的作者,转移到公众号和微博,以另外一种形式继续写作。 再比如外卖和网约车。 大概5年前,网约车刚出现没多久,我所在城市有大量的士司机跑到交通运输部门集体抗议,要求针对网约车采取限制措施。

CHAMPION8888的博客 273

Agent Skills应用解析:构建可扩展、高效率AI探员

Agent Skills是一个简洁而强大的概念:它是一个包含组织化的指令、脚本和资源的文件夹,智能体可以动态地发现并加载这些内容,以在特定任务中表现更佳。可组合性(Composability):一个Agent Skill是一个独立的、封装良好的能力单元。开发者可以为不同的功能(例如PDF处理、网络浏览、数据分析)创建独立的技能,然后根据需要将它们组合起来,赋能不同的智能体。这意味着不再需要为每个用例构建碎片化、定制设计的智能体,而是可以通过组合现有技能来快速构建新的专业智能体。

形上得其象,形下合于数;阴阳自济,玄理自明。 1628

Android开发工程师面试题大全

Android开发工程师面试题大全 java中 == 和equals的区别 == 是运算符,用来比较值是否相同。当基本数据类型做比较时,比较的是数据值是否相同;当引用类型做比较时,比较的是引用类型所关联的对象在内存中的地址是否相同。 equals方法是基类Object中的方法,不能用于基本数据类型。本来是用来比较引用的地址是否相同,主要是判断hashcode是否相等,但在诸如String、Double等类中都进行了重写equals方法和hashcode方法,更改为比较指向的对象所存储的内容是否相等。

Nbin_Newby的博客 1386

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

安卓开发注册登录怎么实现!一线互联网企业高级Android工程师面试题大全,Android岗

前言 新鲜面筋出炉了! 一直都挺喜欢京东这家公司的,于是一边复习,一边看京东的招聘信息。 我是在7月25日投递的简历,投出去后等了三天,一直没有收到回音。本来以为已经石沉大海了的,没想到三天后收到了信息。 因为目标公司不在本地,我当时还在乡下,网不好,所以整个面试节奏都往后推了一下,后面约了8月6日的笔试。 后面,一切顺利进行,11号上午短信+邮件通知12号下午15.30电话面试。 这里要说一下,给我面试的面试官口音是正宗川普,好几次我都没听清,让面试官重复了好几次问题,还好面试官有耐心hhh。 下面,我记

CHAMPION8888的博客 291

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

安卓开发工程师岗位职责!一线互联网企业高级Android工程师面试题大全,附超全教程文档

一、引言 现在已经是十月份的月末了,金九银十,这个找工作和面试的热潮已经渐渐退隐。 潮涨潮退,有的人从里面收获了心仪的offer;有的人走了一趟,一无所获,或者收获寥寥,无甚满意;还有的人在观望,等待下一个良机。 这里分析一波现在的面试行情,带大家了解一下自己所处的位置,另外,分享一下有用的资料,帮助大家提升自己的战斗力。 阿里技术一面-35min 自我介绍 Android 有没有遇到OOM问题(有遇到内存泄漏问题) Handler机制 ThreadLocal Activity启动到加载View过程 V

chayel123的博客 295

android工程师面试准备,Android工程师面试题大全

校招的日子结束了,结果也算圆满。忙碌了一阵子,现在终于可以安安静静的做做项目看看书写写论文了。下面对这段时间面试遇到的问题并结合网上各位的大神秒下的面试题做个总结,本文会持续更新,希望能在面试中助各位一臂之力!Java基础:1、内存泄露的原因:资源对象没关闭。如Cursor、File等资源。他们会在finalize中关闭,但这样效率太低。容易造成内存泄露。SQLiteCursor,当数据量大的时候...

weixin_34901693的博客 148

程序员面试题精选100题答案,作为一名开发8年的安卓高级工程师,全靠这份Android知识点PDF大全

*其实上面说了这么多,钱是永远赚不完的,在这个知识付费的时代,知识技能提升才是是根本!我作为一名8年的高级工程师,知识技能已经学习的差不多。**在看这篇文章的可能有刚刚入门,刚刚开始工作,或者大佬级人物。像刚刚开始学Android开发小白想要快速提升自己,最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以这里分享一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。这么重要的事情再说一遍啦!直达领取链接:点击链接加入群聊【

2301_76348344的博客 945
上一篇: Fragment和Activity生命周期以及横竖屏切换对生命周期的影响
下一篇: Android 源码中的设计模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值