Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.
Head back Home to try finding it again, or search for it on the Archives page.
diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.nojekyll @@ -0,0 +1 @@ + diff --git a/404.html b/404.html new file mode 100644 index 0000000..6285859 --- /dev/null +++ b/404.html @@ -0,0 +1 @@ +
Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.
Head back Home to try finding it again, or search for it on the Archives page.
Lewis Lee | Male | Bachelor of Software Engineer
Email: oppolewis@gmail.com
13+ years of mobile software development expertise, shaping diverse products from photo & video social media to online healthcare and K12 education. Proven ability to manage projects serving millions of users, spanning native (Android & iOS), web, hybrid, and React Native technologies. Adept at delivering high-quality code, architecting scalable solutions, and optimizing performance.
About: Compass Real Estate combines best-in-class technology with exceptional real estate agents to make your search for homes smart and seamless.
About: A modern platform for residential real estate transactions.
About: A professional and powerful collaborative office software. It features dashboards, automation, data management, presentation views, real-time collaboration, permission management, and more. It brings you a simple and efficient way to work.
About: A low-code platform similar to Airtable.
About: The official Starbucks China App. The perfect way to enjoy your favorite coffee, your way.
About: WeLink is a “WeChat” mobile office software used by Huawei employees. It integrates multiple complex function modules including IM, mail system, audio and video conferencing system, and OA system.
About: Roomis is a set of educational information solutions. It provides electronic class cards, electronic class schedules, video surveillance, campus public broadcasting, campus VOIP, and other functions for middle and primary schools. It also provides corporate and university clients with conference room reservation management and attendance check-in.
About: TAGG is a cool app for people around the world to share style, fashion & life.
About: The “quyiyuan” App, a brand of Fun Medical Network, is a product designed to improve the patient experience and improve the service model of medical institutions, covering the whole process of appointment registration, report inquiry, payment, hospitalization management, etc.
About: DouDou Social is a multi-person voice interactive dating platform. It features a unique 8-female-1-male scene-based social mode, allowing users to experience multiple roles as guests, hosts, and audience members.
About: BizConf Video is an enterprise-grade video conferencing service based on SaaS (Software as a Service). It provides a one-stop audio and video interaction platform for users, offering the following key features.
2006 - 2010 Software Engineering, Northwestern Polytechnical University
In the ever-evolving world of Android development, building responsive and efficient apps is paramount. Traditional threading approaches often lead to complex code and potential pitfalls. Enter Kot...
Improvements: Enhanced proficiency in English communication skills. Prioritized quality time with my family, especially with my young daughter. Key Lessons Learned: Acknowledged the imp...
People are often unreasonable, illogical, and self-centered. Forgive them anyway. If you are kind, people may accuse you of selfish ulterior motives. Be kind anyway. If you are successful, you wi...
什么是企业文化? 是指企业经营实践过程中,逐步形成的为全体员工所认同、遵守,带有本企业特色的价值观念。企业文化是无形的制度,是共同的语言,是共同的想法,是一致的行为方式。 一、愿景 愿景是一种意愿的表达“它定义了我们渴望成为什么,达到什么境界,创造出什么”是公司为之奋斗的心愿和远景。 我们公司的愿景:成为更健康、更长久的企业。 利润(赚钱)是生存的必要条件,是实现更健康、更...
很荣幸受到邀请,能有机会代表五十万校友跟新毕业的校友说两句。我一直在想,两三分钟我要讲点什么,能够让在场同学在二三十年后还能记得住,并且有所得益。不知道大家现在心情如何,我依然还记得自己在毕业时候那种兴奋、茫然、激动、困惑、不安、满怀希望、又有点不知所措的复杂心情。二十八年过去了,虽然这种感觉偶尔还会出现,但是在经历了这段人生之路后,会有些感悟。今天,主要以我自己的经历,跟大家分享三点...
[湖南] 岳麓书院 上联: 是非审之于己,毁誉听之于人,得失安之于数,陟岳麓峰头,朗月清风,太极悠然可会 下联: 君亲恩何以酬,民物命何以立,圣贤道何以传,登赫曦台上,衡云湘水,斯文定有攸归
[清] 郑燮 咬定青山不放松 立根原在破岩中 千磨万击还坚劲 任尔东西南北风
[宋] 苏轼 三月七日,沙湖道中遇雨。雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此词。 莫听穿林打叶声,何妨吟啸且徐行。 竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。 料峭春风吹酒醒,微冷,山头斜照却相迎。 回首向来萧瑟处,归去,也无风雨也无晴。
[中庸] 君子素其位而行,不愿乎其外。 素富贵,行乎富贵; 素贫贱,行乎贫贱; 素夷狄,行乎夷狄; 素患难,行乎患难。 君子无入而不自得焉。 在上位,不陵下; 在下位,不援上。 正己而不求于人,则无怨。 上不怨天,下不尤人。 故君子居易以俟命,小人行险以徼幸。 子曰:“射有似乎君子,失诸正鹄,反求诸其身。”
备注 如果只是方便在 Android Studio 中查看 Android Framework 的源码,那么最好的方法还是直接通过 Android Studio 的 Android SDK 页面下载。本文描述的问题和解决方案是在网络出问题的情况下遇到的,正常开发过程应该不会有类似的问题,仅做记录和参考。 问题 可能是网络出了问题,当通过 Android Studio 下载 API Leve...
问题 在项目上有同事写了一段代码,主要功能是将用户输入的纯数字字符串按照美国货币格式展示,比如输入 “1234” -> “1,234”。他的实现方法是先将字符串转换成 double ,再通过 NumberFormat 将其格式化为货币格式。在字符串长度小于16时,能正常工作,但是当字符串长度大于等于16时就会出现异常,比如用户输入的字符串是 “9999999999999999” (1...
问题 做 Android 开发经常需要和模拟器打交道,在特定的业务场景下,需要模拟器能够使用电脑的 VPN 网络,不做一些特别的配置,模拟器是不能使用电脑 VPN 网络的。要解决模拟器的网络问题,需要弄清楚下面三个问题: 模拟器网络工作原理 网络代理的工作原理 如何让模拟器使用电脑的网络代理 这三个问题都能在 Google 给的 模拟器网络搭建 找到答案 模拟器网络工作...
想了很久,决定通过博客来记录自己的成长历程,2017年 已经用 github pages 搭建了自己的博客系统,但是一直未真正开始写。最近反复思考之后,觉得博客对于未来自己要做的事情蛮重要的,所以重新开始了,希望自己能够一直坚持下来,也相信自己能够坚持下来。亡羊补牢,为时未晚!
是指企业经营实践过程中,逐步形成的为全体员工所认同、遵守,带有本企业特色的价值观念。企业文化是无形的制度,是共同的语言,是共同的想法,是一致的行为方式。
愿景是一种意愿的表达“它定义了我们渴望成为什么,达到什么境界,创造出什么”是公司为之奋斗的心愿和远景。
我们公司的愿景:成为更健康、更长久的企业。
利润(赚钱)是生存的必要条件,是实现更健康、更长久的手段。利润就像人体的氧气、食物和水一样 —— 没有他们,就没有生命。创造利润(赚钱)是公司的责任,一个不赚钱的公司是不能长久的。
但是,赚钱不是我们的最终目的的,它是实现愿景的过程。这就像氧气、食物和水一样 —— 这些东西不可或缺,但它们不是生命的目的。
所以,我们需要创造利润,但我们更需要追求更广泛、更有意义的理想 —— 成为更健康、更长久的世界一流企业。尽管在某些事情上我们可能可以获得短期利益(表面上看起来似乎暂时“对公司有利”),但如果因此而影响到公司长远的安全和健康,这种事情我们决不能做。
追求愿景意味着我们必须要脚踏实地,做对的事情,不是本分的事情坚决不做;同时要求我们在永恒保存核心价值的基础上,积极改变除此之外的任何东西,以获得追求进步的驱动力。
我们在创建基业长青的事业,这是我们的诺言,是不言自明的真理。50年后,100年后,甚至更长的时间后,当人们审视步步高公司时,仍然会说:“这是一个基业长青的伟大公司…….”
使命是公司根本的、崇高的责任和义务,是公司存在的基本原因,它定义了不变的“我们为什么存在” 。
我们公司的使命:
对消费者,提供品质优良的产品和服务。
对员工,营造和谐、相互尊重的工作氛围。
对商业伙伴,提供公平合理、对等互利的合作平台。
对股东,使其投入的股本有高于社会平均收益的回报。
我们的首要责任是对所有购买和使用我们产品的消费者负责。我们的产品品质和服务品质必须要满足消费者的需求,并且高于对竞争对手的满意度。我们必须不断致力于降低产品的成本,从而让更多的消费者能购买和使用我们的产品。我们必须不断缩短产品订单的交货期,以最快的速度满足消费者的需要。我们致力于在产品和服务方面给顾客带来超凡的消费体验,让消费者感受到产品的精美和高品质、服务的完善和细心。
我们的第二个责任是对在公司所有岗位工作的全体同仁负责。我们要为员工提高学习和锻炼的机会,帮助员工提高基本素质、业务能力和综合素质。我们要为既合适又合格的员工提供晋升的机会,在考核一个人时以道德品质和价值观念为基本依据。我们提供的工资必须公平而适当,管理者必须公平公正,员工的工作环境必须整洁安全。我们尊重和珍视每位员工的价值,我们相信,员工应该和公司共同成长,这是我们的责任和骄傲。
我们的第三个责任是对我们的供应商、经销商及其他所有商业伙伴负责。我们做生意追求的是“商道”而非“商术”,我们首先要考虑合作伙伴的应有利润。在此基础上再追求自己的合理利润,给每一位商业伙伴提供公平互利的合作平台。我们选择和评价商业伙伴时,关注的是品质、价格和服务,以及诚信合作的一贯性,而不需考虑关系的亲疏及其他社会因素。我们希望和我们的合作伙伴共同成长。
我们的第四个责任是对股东负责。我们必须赚取合理的相当利润,才能研发新项目、制造新产品、实践新构想、制订新规划、支付合适的工资。我们尽到这一切责任后,股东们应该得到公平合理的回报。公司健康、长久的发展离不开投资者(股东)的信任和支持,我们必须给予投资者(股东)坚信的信心和公平的报偿。这是公司得以存在的基础,也是我们诚信文化的体现。
核心价值观是公司的精神和持久的原则——是一套不需要外部调整的永恒指导原则,它对于公司内部的人拥有的价值和意义。它定义了不变的“我们代表什么” 。
我们核心价值观的中心是“本分” ,它是我们价值观的灵魂,它决定了其他所有的观念和处事的原则。本分做到之后,其他的核心价值观都会被涵盖进去。我们核心价值观的基础是“消费者导向” ,消费者的需求(含显在和潜在的需求)是所有企业活动的原始起点。
本分:
做对的事情(有所为有所不为),把事情做对;
专注于自己所从事的工作,把结果放到第一位;
隔离外力,在平常的心态下,把握住我们应该做的合理方向;
本份规范了与人合作的态度——我不赚人便宜;
本分是当出现问题时,首先求责于己的态度。
压力和诱惑往往会使我们平常清静的心态受到震荡,而这种改变的结果大多将使我们偏离正确的方向。本分则是在决策和行动时,我们能够首先将这种外在的作用力先行抛开,在平常的心态下,把握住我们应该做的合理的方向,而不是首先被外在的作用力所牵引,以致作出错误的选择。
我们宁愿自己吃点小亏,也不会去赚别人的便宜,这样做生意往往才能够取得双赢,也才能长久。我们在做生意时追求的是“商道”而非“商术”。 “商道”要求我们首先要考虑合作伙伴的应有利益,在此基础上再追求自己的合理利润,而绝非为了赚钱不择手段、损人利己。
出现问题时,我们不需要任何借口和理由,我们应该首先求责于己,反省自己做错了什么,应该如何去改善。
如何做到本分:
本分和诚信的不同:
本分和诚信的不同是在于诚信是双方面的,有约定的,而本分是不需要约定的,是自己主动知道要这样去做的。本分比诚信要高一个境界,它体现的是我们灵魂深处的东西。本分涵盖了其他几项核心价值观(诚信、团队、品质、消费者导向),而诚信是本分一个方面的体现。
诚信:
我们要在自己的内心深处架起一杆道德天平,诚者不伪,无论外部环境怎样变化,都要忠实于内心的道德法则,真诚为人,不自欺,不欺人,这样才是内诚于心。
我们忠实于自己做出的每一个承诺,言必行,行必果,即使要为此付出艰难的努力、巨大的代价,也要恪守“说到就要做到”的准则,这样才能外信于人。
诚信不仅是一种品行,更是一种责任,不仅是一种道义,更是一种资源。我们把产品推向社会的过程。我们卖给顾客的不仅是商品,更是用心铸造的庄严承诺。我们用心设计品质、制造产品,用心沟通伙伴、服务顾客,用心锤炼品牌、树立形象。我们约束自己,诚笃于胸;我们言出必行,行出必果。
团队:
主动配合支持他人;
实现优势的整合,追求共赢;
没有团队的成功,就没有个人的成功;
相互信任,坦诚沟通,将个人融入团队,以共同愿景为最高目标。
尊重每一位员工的价值,我们相信,员工和公司共同成长,这是我们的责任和骄傲。
我们每个人的成功,都必须建立在团队成功的基础上。步步高的任何人,无论是要个人的能力价值得到发挥,还是要物质利益得到提高,前提都必须是步步高整个团队要取得成功。而一个成功的团队又会带给我们很多有形和无形的资产,会让我们终生受益。
团队中难免会有分歧,重要的是不能让分歧影响团队目标的达成。这就需要我们时刻用团队目标和共同愿景来审视自我,自觉将个人融入团队,相互信任,坦诚沟通,这样我们就能够撇弃偏见,协同工作,达成我们的共同目标。
步步高珍重和珍视每一位员工的价值。我们鼓励员工在工作中不断提升自我,并努力激发员工的潜能。因为我们相信,员工应该和公司共同成长,这是我们的责任和骄傲。
品质:
没有品质一切都是负数;
以品质取得信任,以品牌提升价值;
品质是做出来的,不是检验出来的;
品质就是生命;
品质是精益求精的一种追求,是必须要满足顾客的需求并且高于对竞争对手的满意度;
品质是设计出来的,是全员关心和环环相扣的一个系统工程;
不断提升产品品质,这不仅是我们的价值,更是我们的尊严。
顾客需求的是全面的品质,包括产品的精美度、人性化、可靠性和性价比。我们不仅要满足顾客需求,更要比竞争对手做得更多更好,让消费者更满意。品质是精益求精的一种追求,是一种要不断靠近、一种发自内心的真诚的向往和渴望。
品质是设计出来的,我们会主动贴近市场,努力发掘所有可能为顾客带来愉悦感受的潜在机会,并将之转化为设计语言。我们在设计产品时,以追求产品的人性化、精美度和零缺陷为出发点,旨在产品推出时具有震撼力,能够给顾客带来超凡的消费体验,消费者能够感受到产品的精美与高品质。这就是我们一贯坚持的开发“英雄产品”的思路。
我们有这样的共识:步步高公司与“步步高”品牌同生共荣,而步步高的品质又是步步高人价值与尊严的起点。我们深知,品质是企业生存之更本,没有品质就没有一切,我们对品质的追求永无止境。
品质方针:
假设大家工作时99.9%地投入,那么:
每小时将有1.6万件邮件在邮寄途中丢失; 每小时会有2.2万张支票被存入错误的银行账户; 每天将有50个新生儿因身份被搞混,而被交给错误的父母; 医院里每星期会有500例错误手术; 药剂师每年将给2万个病人开错药; 你的心脏每年会停止跳动3.2万次。 所以:品质就是生命!
消费者导向:
消费者是检验我们工作的唯一标准;
步步高不仅注重消费者需求,也注重消费者购买后的评价。
从消费者的角度来设计产品、提高服务,避免做貌似消费者喜欢的东西;
通过科学、严谨的市场调查,充分地研究消费者的需求,消费者的需求是所有企业活动的原始起点;
在公司内部的日常工作中,要坚持内部客户导向的原则。
我们公司的所有经营活动必须要首先从消费者的角度来看,这是消费者需要的吗,消费者会喜欢吗,然后再从这个角度来开发产品、提供服务——这就是消费者导向。我们要坚决避免做貌似消费者喜欢的东西。
市场上必定存在这样的需求:它是消费者所需要的、我们能够做出优势,并且能比竞争对手更好的满足消费者。我们要去寻找、挖掘和发现这种需求,巧妙的将产品在功能和技术上的创新优势转化为消费者的利益,在满足消费者需求和发挥我们自身特色上保持良好的平衡。
在公司内部,有我们个自的内部顾客 。我们工作时首先要弄清楚,自己的直接客户是谁,他喜欢我所做的工作吗,我所到的结果正是他需要的吗。我们工作的目的不是为了完成任务,而是为了创造卓越的结果,使顾客更满意。内部客户导向是消费者导向在公司内部日常工作中的表现。
———— 这叫彻底消费者导向!
作者:思弦君 链接:https://xueqiu.com/2740739644/172093568 来源:雪球 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
People are often unreasonable, illogical, and self-centered.
Forgive them anyway.
If you are kind,
people may accuse you of selfish ulterior motives.
Be kind anyway.
If you are successful,
you will win some false friends and some true enemies.
Succeed anyway.
If you are honest and frank,
people may cheat you.
Be honest and frank anyway.
What you spend years building,
someone could destroy overnight.
Build anyway.
If you find serenity and happiness,
they may be jealous.
Be happy anyway.
The good you do today,
people will often forget tomorrow.
Do good anyway.
Give the world the best you have,
and it may never be enough.
Give the best you’ve got anyway.
You see,
in the final analysis it is between you and God;
it was never between you and them anyway.
很荣幸受到邀请,能有机会代表五十万校友跟新毕业的校友说两句。我一直在想,两三分钟我要讲点什么,能够让在场同学在二三十年后还能记得住,并且有所得益。不知道大家现在心情如何,我依然还记得自己在毕业时候那种兴奋、茫然、激动、困惑、不安、满怀希望、又有点不知所措的复杂心情。二十八年过去了,虽然这种感觉偶尔还会出现,但是在经历了这段人生之路后,会有些感悟。今天,主要以我自己的经历,跟大家分享三点,关于毕业之后,做个什么样的人。
第一,做个胸无“大”志的人。
首先要强调的是,这里的“大”是好大喜功的大。所谓胸无“大”志,指的是脚踏实地的做事态度。我们要胸无“大”志地去做自己喜欢的事情,同时,还要努力去喜欢自己在做的事情。我觉得,只有在做自己喜欢的事情的时候,才能激发自己最大的潜力,所以每个人首先要花很大精力去寻找自己喜欢的事情。同时,我也要强调后面一点,喜欢自己在做的事情。大学刚毕业就马上找到自己喜欢的事情,是可遇不可求的。很多时候,当我们投入到自己的工作中后,会慢慢找到很多乐趣,在努力的过程中,会渐渐发现自己喜欢做什么。所以,努力喜欢自己做的事情很重要。胸无“大”志,需要大家慢慢体会。
第二, 做个有所不为的人。
我们有句话叫做“有所为,有所不为”。我们常常注意到要“有所为”,但我要强调的是“有所不为”。我很早就听说过,要做对的事情,然后把事情做对。在经历了这些年,经历很多次的头破血流之后,我才真正开始明白这句话是什么意思。所谓做对的事情,就是知道是错的事情决不要做,知道做错了马上要改。这个说起来容易,做起来困难。知道做错了马上改,不管多大的代价,到最后往往是最小的代价。我看到很多人明知是错,犯了错之后抱着侥幸的心态,浪费很多年之后最后要付出更大的代价。希望大家不要碰到这样的情况。很多人问我,为什么我们公司在消费电子领域这么多年之后一直存在,我们就是守诚信、平常心、坚守本分。本分就是有所不为的意思。把事情做对,本身是个学习的过程,这个过程当中是要犯很多错误的。有种说法“不怕犯错误”,我们做对的事情时,要避免犯错,但把事情做对的过程中会犯很多错误,这个大家要理解。还有个说法“永不放弃”,就是要坚持对的事情,如果是错的事情,要立即回头。
第三,做个正直的人。
无论能否做到以上两点,但最基本的是要做个正直的人。我不知道做个正直的人,会有什么回报,但至少让人一生坦然。
我就讲这三点,大学毕业是我们进入社会大学的起点,我们要学习的东西是无穷无尽的。最后,衷心祝愿每一位同学都能找到属于自己的精彩人生。
作者:思弦君 链接:https://xueqiu.com/2740739644/172834396 来源:雪球 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
君子素其位而行,不愿乎其外。
素富贵,行乎富贵;
素贫贱,行乎贫贱;
素夷狄,行乎夷狄;
素患难,行乎患难。
君子无入而不自得焉。
在上位,不陵下;
在下位,不援上。
正己而不求于人,则无怨。
上不怨天,下不尤人。
故君子居易以俟命,小人行险以徼幸。
子曰:“射有似乎君子,失诸正鹄,反求诸其身。”
三月七日,沙湖道中遇雨。雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此词。
莫听穿林打叶声,何妨吟啸且徐行。
竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
料峭春风吹酒醒,微冷,山头斜照却相迎。
回首向来萧瑟处,归去,也无风雨也无晴。
做 Android 开发经常需要和模拟器打交道,在特定的业务场景下,需要模拟器能够使用电脑的 VPN 网络,不做一些特别的配置,模拟器是不能使用电脑 VPN 网络的。要解决模拟器的网络问题,需要弄清楚下面三个问题:
这三个问题都能在 Google 给的 模拟器网络搭建 找到答案
官方文档在开始简略的介绍了模拟器的网络工作原理,总结下面几条
模拟器地址空间已经按照规则预先分配
IP地址 | 描述 |
---|---|
10.0.2.1 | 网关 |
10.0.2.2 | 主机环回地址的别名,即对应开发机的 localhost |
10.0.2.3 | 模拟器的第一 DNS 服务器地址 |
127.0.0.1 | 模拟器的环回地址,不对应开发机的 127.0.0.1 |
网络代理和现实生活中的代理,概念一致,即作为客户端和服务端的中间人,代理客户端所有的请求,从服务端拿到资源后,再返回给客户端。客户端和服务端不直接联系。 具体的原理可以参考 Proxy server
如果能够给模拟器设置一个代理服务器,同时这个代理服务器又把所有请求转发给开发机的代理服务器,似乎就能解决问题。这个方案实施,需要满足两个条件
第一个条件很简单,因为模拟器本身就支持设置全局代理。第二个条件要怎么实现呢?
在模拟器网络工作原理这一节,我们知道,模拟器的网络是独立于开发机的网络的,有一套独立的路由体系。但是这种独立并非完全没有联系,在预制的 IP 地址中,我们可以知道 10.0.2.2 这个地址就对应了开发机的 localhost,也即开发机的 127.0.0.1 这个 IP。所以只要我们把代理服务运行的IP(10.0.2.2) 和 端口(比如: 7890) 设置到模拟器的全局代理上,就可以让模拟器使用开发机的代理。
如果只是方便在 Android Studio
中查看 Android Framework
的源码,那么最好的方法还是直接通过 Android Studio
的 Android SDK
页面下载。本文描述的问题和解决方案是在网络出问题的情况下遇到的,正常开发过程应该不会有类似的问题,仅做记录和参考。
可能是网络出了问题,当通过 Android Studio
下载 API Level 31
的源码时,总是提示失败,到 SDK 配置的页面, 在勾选 Show Package Details
的情况下,也没看到 API Level 31
的 source 下载选项,误以为是不是 google 没有提供这个版本的源码,但是项目的 Compile SDK Level
正好配置的 31,在这种情况下,如果想看 Android framework
的源码,只能通过修改 Compile SDK Level
和 手动关联源码的方式来解决。项目上还有其他协同开发的同事,冒然修改 Compile SDK 不是很合适。那就剩手动关联源码的解决方案了。
要手动关联源码,首先需要知道 Android Studio
的源码关联机制是怎么工作的,这个有很多资料可查,不在本文详述。
解决步骤:
在 Android Studio
上,关联关系存储在如下位置:
~/Library/Application Support/Google/AndroidStudio{version}/options/jdk.table.xml
比如我本地环境的配置文件存储在:~/Library/Application Support/Google/AndroidStudio2021.1/options/jdk.table.xml
如果相关 SDK 的配置节点已经存在,则只需检查 <sourcePath>
节点是否存在,如果不存在,则添加对应的路径
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+
<jdk version="2">
+ <name value="Android API 31 Platform" />
+ <type value="Android SDK" />
+ <version value="version 11.0.11" />
+ <homePath value="$USER_HOME$/Library/Android/sdk" />
+ <roots>
+ <annotationsPath>
+ <root type="composite">
+ <root url="jar://$USER_HOME$/Library/Android/sdk/platforms/android-31/data/annotations.zip!/" type="simple" />
+ </root>
+ </annotationsPath>
+ <classPath>
+ <root type="composite">
+ <root url="jar://$USER_HOME$/Library/Android/sdk/platforms/android-31/android.jar!/" type="simple" />
+ <root url="file://$USER_HOME$/Library/Android/sdk/platforms/android-31/data/res" type="simple" />
+ </root>
+ </classPath>
+ <javadocPath>
+ <root type="composite" />
+ </javadocPath>
+ <sourcePath>
+ <root type="composite">
+ <root url="file://$USER_HOME$/Library/Android/sdk/sources/android-31" type="simple" />
+ </root>
+ </sourcePath>
+ </roots>
+ <additional jdk="Android Studio default JDK" sdk="android-31" />
+</jdk>
+
在项目上有同事写了一段代码,主要功能是将用户输入的纯数字字符串按照美国货币格式展示,比如输入 “1234” -> “1,234”。他的实现方法是先将字符串转换成 double ,再通过 NumberFormat 将其格式化为货币格式。在字符串长度小于16时,能正常工作,但是当字符串长度大于等于16时就会出现异常,比如用户输入的字符串是 “9999999999999999” (16 个 9),期望展示的结果是 “9,999,999,999,999,999”,实际结果是 “10,000,000,000,000,000”。 开始大家认为是输入的数字过大,超过了 double 所能表示的数据范围,数据溢出导致结果出错。这个问题超出了我的知识边界,所以一开始我也没想清楚为什么?但是心里产生了一个疑问:如果真是数据溢出了,那么 double 能够处理的数据范围是多少?带着这个问题,我在网上查阅了相关资料,大体弄明白了这个问题的原因。
下面这张图清晰的描述了双精度浮点数的存储原理
根据存储原理,11 位指数位能够表示的数据范围是 10^-308^ 和 10^308^ 之间的数字,具有完整的 15-17 位十进制数字精度。
53 位有效数字精度提供 15 到 17 位有效十进制数字精度 (2^53^ ≈ 1.11 × 10^16^)
可以精确表示从 -2^53^ 到 2^53^(-9,007,199,254,740,992 到 9,007,199,254,740,992)的整数
2^53^ 和 2^54^ 之间的整数 = 18,014,398,509,481,984 舍入为 2 的倍数(偶数)
2^54^ 到 2^55^ 之间的整数 = 36,028,797,018,963,968 舍入为 4 的倍数
按照 IEEE 754 标准,如果将一个至多 15 位有效数字的十进制字符串,转换为 double 表示,然后再转换为十进制字符串,则最终结果与原始的字符串匹配。
但是对于超过 15 位的字符串,只能够保证,将一个至少 17 位的 double 转换为十进制字符串,然后再转换为 double 表示时,最终结果必须与原始数字匹配。
想了很久,决定通过博客来记录自己的成长历程,2017年 已经用 github pages 搭建了自己的博客系统,但是一直未真正开始写。最近反复思考之后,觉得博客对于未来自己要做的事情蛮重要的,所以重新开始了,希望自己能够一直坚持下来,也相信自己能够坚持下来。亡羊补牢,为时未晚!
In the ever-evolving world of Android development, building responsive and efficient apps is paramount. Traditional threading approaches often lead to complex code and potential pitfalls. Enter Kotlin coroutines, a powerful tool that simplifies asynchronous programming, making your Android apps smoother and more maintainable.
This blog post delves into the world of Kotlin coroutines, guiding you through their core concepts, practical usage in Android development, and best practices for leveraging their potential.
What are Kotlin Coroutines?
Kotlin coroutines are lightweight threads that offer a structured approach to handling asynchronous tasks without the complexity of traditional threading. Unlike threads, coroutines are suspended and resumed, allowing them to be more efficient and less resource-intensive. This suspension capability empowers them to “pause” execution while waiting for something to happen (e.g., network call completion) without blocking the main thread.
Key Concepts:
launch
and async
help you create and launch coroutines.lifecycleScope
in Activities/Fragments and viewModelScope
in ViewModels.suspend
keyword can pause execution and be resumed later. Network calls and disk I/O operations are often implemented as suspending functions.Benefits of Using Coroutines:
Putting Coroutines into Action:
Here’s a simple example demonstrating how to fetch data from an API using coroutines:
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+
fun fetchData() {
+ viewModelScope.launch { // Launch a coroutine in the viewModelScope
+ val data = try {
+ val response = URL("[https://api.example.com/data](https://api.example.com/data)").readText()
+ // Parse the response and return the data
+ parseData(response)
+ } catch (e: Exception) {
+ // Handle network or parsing errors
+ null
+ }
+ // Update UI with the fetched data
+ updateData(data)
+ }
+}
+
In this example, the fetchData function launches a coroutine within the viewModelScope. The coroutine fetches data from an API using a suspending function (readText). If successful, the data is parsed and used to update the UI. Any errors during the process are handled gracefully.
Best Practices:
Conclusion:
Kotlin coroutines empower you to write asynchronous code in a structured and efficient manner, leading to smoother and more responsive Android applications. By understanding the core concepts, practical usage examples, and best practices, you’ll be well on your way to mastering this powerful tool in your Android development journey.