安卓

雇佣 排名前3% of 自由安卓开发者

PT视讯是一个面向顶级安卓开发者的市场, 工程师, 程序员, 程序员, 架构师, 和顾问. 顶级公司和初创企业选择PT视讯的安卓自由职业者来完成关键任务的软件项目.

无风险试验,满意才付款.

客户的速度 PT视讯 安卓开发者4.4 / 5.0截至2021年12月16日,平均有723篇评论

被领先品牌和初创公司所信赖

雇佣自由安卓开发者和工程师

库尔提茉莉花

自由安卓开发者

波斯尼亚和黑塞哥维那2016年6月16日起成为PT视讯会员

Jasmin是一位负责任的开发人员,在开发创新和复杂的安卓应用程序方面有着丰富的经验. 他非常有组织, 为自己的沟通能力感到自豪, 享受团队合作的特殊待遇. 贾斯敏喜欢接受挑战并解决问题.

显示更多

帕特里克Keenum

自由安卓开发者

美国2018年6月11日起成为PT视讯会员

Patrick是一名高级全栈工程师,拥有超过10年的开发经验, 可靠的, 和可伸缩的产品. 他热衷于将创意从概念带到发布环节, 与各种技术水平的客户合作, 打造帮助公司成长的产品.

显示更多

穆罕默德Mutahr

自由安卓开发者

美国2018年3月2日起成为PT视讯会员

Muhammad是一名高级软件工程师,在公共教育部门(WSU)等行业拥有多年的经验。, 私营医疗保健公司(Meridian), 以及上市的《PT视讯官网》500强汽车行业公司(通用汽车 & 麦). 在他的整个职业生涯, 他用HTML/CSS设计网页应用, 使用JavaScript框架(Angular/Ionic)开发客户端应用, 并使用Java和c#开发健壮的服务器端应用程序.

显示更多

鲍里斯Yordanov

自由安卓开发者

葡萄牙2017年7月4日起

Boris是一名全职web开发人员,主要使用香草JavaScript和最流行的JavaScript框架(如Angular), 反应, 和流星. 他14岁时创建了自己的第一个网站, 从那以后, 在他的自由职业生涯中,他创建了400多个WordPress网站. 现在,他设计和构建定制的web应用程序和网站.

显示更多

丹Napierski

自由安卓开发者

美国2015年12月20日至今

Dan是一名软件架构师和技术专家,专注于区块链技术的应用. 他拥有多年为客户提供专业咨询服务的经验,从初创企业到跨国公司. 他的专长是将严格的测试和防弹的代码带到困难的工程挑战中. 他在人工智能的许多方面都有着深厚的专业知识, 区块链, 机器学习, 和自动化.

显示更多

理查德Kolkovich

自由安卓开发者

美国2015年5月6日起成为PT视讯会员

从技术支持到联合创始人,理查德包罗万象. 在他的职业生涯, 他积累了深厚的技术理解,以及对建立和发展一个成功企业的其他必要要素的广泛理解. 他丰富的经验和技术专长使他特别适合用技术解决商业问题.

显示更多

伊云Zlatkovic

自由安卓开发者

塞尔维亚2014年9月30日起成为PT视讯会员

Branislav是一名软件工程师,拥有5年的安卓开发经验,曾为索尼 移动等公司开发过多个安卓项目, 瓶火箭工作室, 和MindGeek. 丰富的经验涵盖了各种不同的项目设置,从构建应用程序的开始到结束,开发和持续交付大规模, 长期项目. 作为一个温和的完美主义者,他是任何开发团队的宝贵贡献者.

显示更多

AdrianŚwięń

自由安卓开发者

波兰2016年3月24日起成为PT视讯会员

Adrian是一名优秀的开发人员,拥有广泛的技能和超过十年的经验. 他拥有信息学的专业学位,并参与了各个级别的项目, 从低级汇编编码到多平台桌面和移动应用程序. 最近值得注意的项目包括一个飞行/竞赛模拟器,它可以在两个轴上无限制地360度旋转,支持多个游戏,以及一个OpenGL音乐可视化应用程序.

显示更多

休伯特Orlik-Grzesik

自由安卓开发者

波兰2014年1月21日起成为PT视讯会员

Hubert is an incredibly fast learner; -he was once able to pick up a musical instrument in the morning 和 play nice tunes by the afternoon. 当涉及到新技术和新项目时,他有同样的技能. 他重视高质量的代码和对细节的关注,他非常关心优秀的用户体验.

显示更多

德米特里•Ryazantsev

自由安卓开发者

俄罗斯2015年9月21日起成为PT视讯会员

Dmitry是一名拥有6年以上经验的安卓开发者,他善于沟通,总是努力寻找适合项目的最佳技术. 他使用过Git、Lua (Corona SDK)、RxJava和Dagger等工具. 他与一个大型团队合作开发的Y和ex浏览器已经有超过1000万的安装量. 他还开发了自己的项目:一款拥有250个成员的游戏,000个安装并发布了一些其他的应用程序.

显示更多

伊凡Dimoski

自由安卓开发者

瑞典2013年11月26日起成为PT视讯会员

Ivan是一位拥有超过10年安卓开发经验的专业人士. 他最近的角色包括一个人的贡献, Truecaller为17人的敏捷跨职能团队提供团队领导和工程管理, 为2.5亿多月活跃用户提供惊人的功能. 作为一个热情的人, 他认为开放和简单是创造成功故事的基础.

显示更多

现在就注册看看更多的资料.

开始招聘

招聘指南

雇佣优秀安卓开发者指南

真正的安卓专家知道的不仅仅是如何编写应用程序. 他们对平台的细微差别和不同的执行选项有透彻的了解. 本指南中提出的问题有助于识别那些有经验的安卓开发人员,以在安卓平台上产生熟练的结果.

阅读招聘指南

安卓招聘资源

Trustpi很多
媒体报道

... 允许公司快速组建具有特定项目所需技能的团队.

尽管对编码员的需求不断增长,PT视讯却以其几乎达到常春藤盟校(Ivy league)水平的审核而自豪.

我们的客户
创建一个跨平台应用,供全世界使用
蒂埃里Jakicevic
创建一个跨平台应用,供全世界使用
奖状

如果没有PT视讯, Tripcents就不会存在. PT视讯 Projects让我们的基金会在产品经理的帮助下快速发展, 带领开发人员, 和高级设计师. 在60多天的时间里,我们从概念到Alpha. 它的速度、知识、专业技能和灵活性是首屈一指的. PT视讯团队和其他内部团队成员一样,都是tripcents的一部分. 他们和其他人一样为开发做出了贡献并获得了所有权. 我们将继续使用PT视讯. 作为一个创业公司,它们是我们的秘密武器.

首席执行官Brantley步伐 & 联合创始人

Tripcents

我对PT视讯的经验非常满意. 和我一起工作的专业人士在几个小时内就和我通了电话. 在和他讨论了我的项目后,我知道他是我想要的候选人. 我立刻雇佣了他,他也立刻参与了我的项目, 甚至通过添加一些很棒的设计元素来增强我们的整体外观.

导演保罗•Fenley

K邓恩 & 的同事

与我搭档的开发人员都非常出色——聪明、有动力、反应灵敏. 过去很难找到高质量的工程师和顾问. 现在不是.

瑞安·洛克菲勒,首席执行官

Radeeus

PT视讯立即理解了我们的项目需要. 我们请来了一位来自阿根廷的优秀自由职业者, 从第一天起, 投身于我们的行业, 与我们的团队完美融合, 理解我们的愿景, 并产生了一流的结果. PT视讯使得与高级开发人员和程序员的联系非常容易.

Jason Kulik创始人之一

ProHatch

作为一家资源有限的小公司,我们不能犯代价高昂的错误. PT视讯为我们提供了一个经验丰富的程序员,他能够立即投入工作并开始贡献. 这是一个伟大的经历,我们会在心跳中再次重复.

斯图尔特·柏克尼校长

站点专用软件解决方案

我们通过PT视讯聘请了一位拥有丰富亚马逊网络服务经验的开发人员. 我们面试了四位候选人,其中一位非常符合我们的要求. 这一过程迅速而有效.

Abner Guzmán Rivera,首席技术官和首席科学家

照片Kharma

Sergio是一个非常棒的开发者. 一流,反应灵敏,工作效率高.

Dennis Baldwin,首席技术专家和联合创始人

PriceBlink

和Marcin一起工作是一种乐趣. 他是主管, 专业, 灵活的, 并且非常快地理解需要什么以及如何实现它.

Andre Fischer首席技术官

POSTIFY

我们需要一位专业的工程师,他能立即开始我们的项目. Simanas的工作超出了我们的预期. 不需要面试和寻找专业的开发人员是一个非常好的时间节省,并使每个人对我们选择转换平台以使用更健壮的语言感到更舒服. PT视讯让这个过程变得简单和方便. PT视讯现在是我们寻求专家水平帮助的第一个地方.

Derek Minor,网络开发高级副总裁

Networld传媒集团

PT视讯的开发人员和架构师都非常专业,也很容易共事. 他们所提供的解决方案价格合理且质量上乘,从而缩短了我们的发行时间. 再次感谢,PT视讯.

首席执行官杰里米鞋号

Kognosi

PT视讯给我们带来了很棒的体验. 他们为我们的应用程序匹配了完美的开发人员,使这个过程非常容易. 它也很容易超出最初的时间框架, 我们能够在整个项目中保持同一个承包商. 我们强烈推荐PT视讯快速无缝地寻找高质量人才.

瑞安莫首席技术官

应用商业技术有限公司

PT视讯给我留下了深刻印象. 我们的开发人员每天都和我交流,他是一个非常强大的程序员. 他是一个真正的专业人士,他的作品非常出色. PT视讯 5星.

首席执行官皮特Casoar

Ronin Play Pty Ltd

与PT视讯合作是一次很棒的经历. 使用它们之前, 我花了很长时间采访其他的自由职业者,却没有找到我需要的. 在与PT视讯接触后,他们在几天内就为我找到了一个完美的开发者. 与我一起工作的开发人员不仅交付高质量的代码, 但他也会对一些我没有想到的事情提出建议. 我很清楚阿莫里知道他在做什么. 强烈推荐!

首席执行官乔治•程

Bulavard公司.

作为一名合格的PT视讯前端开发人员,我还经营着自己的咨询业务. 当客户来找我帮忙填补他们团队中的关键角色时, PT视讯是我唯一放心推荐的地方. 托普塔尔的所有候选人都是精英中的精英. PT视讯是我在近五年的专业在线工作中发现的最物有所值的.

伊桑•布鲁克斯首席技术官

Lang很多z专利 & 商标工作的公司.

在讨价还价早期, 我们需要一流的开发人员, 以可承受的利率, 及时地. PT视讯交付!

首席执行官劳拉Aldag

讨价还价

PT视讯让你非常容易找到一个候选人,并让你放心,他们有能力提供. 我肯定会向任何寻找高技能开发人员的人推荐他们的服务.

Michael Gluckman,数据经理

Mxit公司——

PT视讯能够迅速将我们的项目与最优秀的开发人员匹配起来. 开发人员已经成为我们团队的一部分, 我对他们每个人所表现出的敬业程度感到惊讶. 对于那些希望与最好的工程师远程工作的人来说,PT视讯是最好的选择.

创始人Laurent爱丽丝

Livepress

PT视讯让找到合格的工程师变得轻而易举. 我们需要一个有经验的ASP.净 MVC架构师来指导我们的初创应用程序的开发, PT视讯在不到一周的时间里就有了三个很好的候选人. 在我们做出选择后,工程师立即上线并开始工作. 这比我们自己发现和审查候选人要快得多,也容易得多.

联合创始人杰夫•凯利

协同解决方案

我们需要一些短期的Scala开发工作,PT视讯在24小时内就为我们找到了一个优秀的开发人员. 这是任何其他平台都不可能实现的.

弗兰科斯巴达,创始人之一

WhatAdsWork.com

PT视讯为快速发展和规模化的企业提供了不妥协的解决方案. 我们通过PT视讯聘请的每一位工程师都迅速融入了我们的团队,在保持卓越开发速度的同时,他们的工作达到了最高的质量标准.

联合创始人格雷格•金博

nifti.com

如何通过PT视讯招聘安卓开发者

1

与我们的行业专家之一谈谈

PT视讯的工程总监将与您一起工作,以了解您的目标, 技术需求, 和团队动力.
2

与精心挑选的人才一起工作

几天之内,我们会为你的项目介绍合适的安卓开发人员. 平均匹配时间在24小时以下.
3

合身,保证

与新的安卓开发人员合作试用一段时间(满意才付款), 在订婚前确保他们是合适的人选.

常见问题

  • PT视讯 安卓开发者有何不同?

    在PT视讯, 我们彻底筛选我们的安卓开发人员,以确保我们只匹配您的人才的最高水平. 超过100个,每年有1万多人申请加入PT视讯网络, 只有不到3%的人能成功. 你将与工程专家(而不是一般化的招聘人员或人力资源代表)一起工作来理解你的目标, 技术需求, 和团队动力. 最终的结果是:专家从我们的网络中审查人才,定制匹配,以满足您的业务需求. 现在就开始.

  • 我可以通过PT视讯在48小时内雇佣安卓开发者吗?

    这取决于可用性和进度的快慢, 你可以在注册后48小时内开始与安卓开发者合作. 现在就开始.

  • PT视讯 安卓开发者的无风险试用期是什么时候?

    我们确保你和你的安卓开发者之间的每次接触都有长达两周的试用期. 这意味着您有时间确认订婚是否成功. 如果你对结果完全满意的话, 我们将按时间向你收费,你们的婚约想继续多久就继续多久. 如果你不完全满意,你不会被收费. 从那里, 我们有两种选择, 或者我们可以为您提供另一位可能更适合的专家,我们将与他开始第二个, 无风险试用. 现在就开始.

分享
安卓

如何雇佣优秀的安卓开发人员

和其他技术一样,我们需要了解安卓,并且真正了解安卓. 本指南提供了一些问题样本,在招聘兼职或全职安卓应用程序开发人员时,这些问题是评估应聘者掌握安卓移动框架的广度和深度的关键.

所面临的挑战

安卓已经成为 主流智能手机 该平台在全球拥有超过81%的市场份额(超过苹果iOS的15%和微软窗户的4%之和)和2.4亿台移动设备. 还不算太糟. 随之而来的是对开发人才的巨大需求,所以要定位 精英 安卓应用程序开发人员可能是一项艰巨的任务.

找到他们需要一个高效的招聘过程,正如我们在文章中描述的那样 在寻找精英少数-发现和雇用最好的软件开发人员在行业. 这样的过程可以通过问题来扩充——就像本文中提出的问题——来识别那些分布在全球各地的真正的安卓专家.

安卓是一个基于Java和XML的基于Linux的智能手机操作系统. 因为安卓操作系统不仅仅是一种语言, 但一个完整的, 丰富和不断增长的软件框架, 它有一个 很多 掌握. 在撰写本文时,安卓已经是第7个年头了,现在是第4版.4(“奇巧”)和已经经历了19个SDK发布.

谷歌在2007年将安卓作为一个开源项目引入 AOSP),以便在新兴的智能手机市场站稳脚跟. 许多硬件供应商已经在他们的手机上使用了安卓系统(三星, 宏达电, 索尼, 摩托罗拉和LG只是举几个例子), 经常添加自己的自定义特性和代码. 当不兼容或特定于供应商的bug出现时,这有时会给开发人员带来额外的麻烦(也就是变通方法)。. 安卓本身也不是一个完美的移动应用开发操作系统, 当然,由于它有时缺乏文档和一些行为怪异的代码,但它仍然是一股不可忽视的力量.

安卓应用开发平台提供了大量的特性和支持类:

  • 用户界面,动画,图形,不同屏幕尺寸和方向的支持
  • 触摸屏键盘和手势识别
  • 数据库、内容提供者、内容解析器、适配器
  • 位置检测、传感器、服务
  • 线程的选项
  • 加速计算
  • Inter-app沟通
  • 媒体播放和录制
  • 网络和连接
  • 谷歌播放商店和应用内部计费
  • 本地化
  • 调试工具
  • 和更多…

这种复杂性会让任何开发人员晕头转向,更不用说招聘经理了. 那么,在采访安卓程序员时,我们应该从哪里开始呢?

真正的安卓专家将会对不同的实现选项以及它们的影响和后果有一个全面和有原则的理解.

安卓移动应用开发专家和新手的区别不仅仅在于如何编写应用程序. 当面对复杂的任务时, 真正的安卓专家将会对不同的实现选项以及它们的影响和后果有一个透彻和有原则的理解. 本指南中提出的问题可以帮助你找到那些少有的安卓大师,他们有这种理解,并可以显著提高你的项目的生产力和吞吐量.

用户界面

用户界面 (UI)是应用的外观. 应用的UI非常重要,因为它构成了用户如何与你的应用进行交互和感知的基础. 安卓提供了许多开发者可以利用和定制的类,同时也提供了一个用户可以依赖的通用框架.

例如,安卓为顶部导航系统提供了一个通用的解决方案 ActionBar. 它还提供了对 NavigationDrawer 用户可以通过点击ActionBar菜单按钮或滑动屏幕的左边缘来滑动打开和关闭. 安卓提供了大量的UI类和小部件来布局视图, 创建动画, 执行自定义图, 显示 画板 (图标、位图、形状等.),更.

安卓 UI的大部分内容都可以用XML指定, 但也可以编写自定义子类来扩展安卓 UI类来创建自定义视图和行为. UI的范围相当广泛(它甚至包括媒体播放, video, audio, 手机振动, 例如), 所以我们不能涵盖所有内容, 但我们将强调一些关键领域,这是可靠的安卓开发者应该精通的.

问:什么是活动和片段? 什么时候以及为什么应该使用其中一种而不是另一种?

An 活动 用户界面组件是否代表屏幕上的主要关注焦点. 相比之下, 片段, 随着屏幕更大的平板电脑出现而推出, 附加到活动并在活动中显示的组件是可重用的吗. 多个片段可以在一个活动中同时显示. 虽然可以只使用Activities来开发UI, 这通常是一个坏主意,因为他们的代码以后不能在其他活动中重用. 精英开发人员知道这一点,并编写片段(有时在琐碎的活动中使用) 未来的证明 他们的应用程序. 使用这种方法, 该活动支持其附加的片段, 让碎片, 他们的布局和视图处理了大部分用户界面.

例如, 假设您希望用户能够水平滚动一组页面,其中每个页面可能显示一个列表, 照片, 相片画廊, 指示板, 或形式. 这里你可以用 : 视图page 在你的活动中,它的条目是片段,分别处理每个独特的用户界面功能. 如果开发人员将这些页面编写为Activities, 他们必须将它们重构为片段.

还要注意的是,虽然你可以使用一个活动而不使用Fragment,但是反过来是不正确的.

问:什么是适配器,何时以及如何使用它们?

如果不使用适配器,就很难开发安卓应用程序,因为适配器非常重要.

适配器适用于何处? 它们架起了模型和视图的桥梁.g. 适配器视图s列表视图, 显示数据表格, 纺纱: 视图pages)和基础数据. 它们提供对数据项的访问,并负责为数据集中的每个项创建视图.

安卓本身并没有采用MVC模式. 您定义适合您的模型. 安卓帮助你布局和渲染视图, 你可以定制安卓的activity和片段,它们通常作为控制器.

新手开发人员可能会尝试使用简单的方法 助手 适配器等 Array适配器, Simple适配器Simple光标适配器 在可能的情况下, 但对于当今应用程序通常需要的一些更复杂的视图来说,这些视图通常太有限了. 熟练的开发人员将编写扩展的适配器 Base适配器 直接,因为它比上面提到的子类助手更强大、更灵活.

下面的代码片段显示了在列表视图中显示联系人的自定义联系适配器. (注:只显示较重要的方法.)

//用于说明目的的基本数据模型
类接触{
    公共int id;
    公共字符串名称;
    公共字符串电话;
}

公共类联系适配器扩展Base适配器实现List适配器 {
    上下文mContext;
    List<联系> m联系s;

    公共联系适配器(Context Context) {
        mContext =上下文;
    }
    
    //调用此方法将数据附加到该适配器,并在数据更改时调用.
    public void newData(List<联系> data) {
        m联系s =数据;
        //通知适配器视图数据已经改变,并在必要时重新绘制.
        notifyDataSetChanged (); 
    }

    //适配器的关键——绑定数据到视图布局.
    @Override
    public 视图 get视图(int position, 视图 convert视图, 视图Group parent) {
        联系 联系 = m联系s.(位置);
        LinearLayout视图= (LinearLayout) convert视图;
        If (视图 == null) {
            //“膨胀”我们的联系人.XML视图的出现.
            LayoutInflater充气器= (LayoutInflater)
                mContext.getSystemService(上下文.LAYOUT_INFLATER_SERVICE);
            视图 = (LinearLayout)膨胀器.充气(右.布局.接触,零);
        }
        //将数据绑定到布局中相应的text视图.
        ((Text视图)视图.find视图ById (R.id.的名字).setText(联系.的名字);
        ((Text视图)视图.find视图ById (R.id.手机)).setText(联系.电话);
        // ... 等. ...
        返回视图;
    }
}

性能和响应性

用户的要求很高. 你的应用程序必须执行和响应,否则人们会感到沮丧,并干脆停止使用它.

而对应用程序的要求应该明确定义可接受的响应时间(尽管越短越好), 开发人员自己应该对什么是合理的有一个大致的认识,并采取相应的措施来优化性能. 例如, 当从服务器获取大量数据时, 应该采取步骤避免锁定用户界面(i.e.,通过在后台线程加载数据).

经验丰富的安卓开发者应该有各种各样的性能优化技巧. 下面的问题旨在评估他们在这方面的敏锐性.

问:有哪些方法可以优化视图的使用?

如果不小心, 不知情的安卓开发者很容易在布局中创建更多的视图. 你可以从布局中移除的视图越多,你的应用程序的响应速度就越快. 更少的视图意味着更少的内存消耗和更少的垃圾收集, 以及更少的初始化工作, 布局, 画, 和遍历视图.

糟糕的设计很快就会显现出来, 例如, 当试图快速滚动未优化的布局, 哪些会显得迟钝和不稳定. 如果特别坏, 滚动体验可能无法使用, 特别是在cpu速度较慢的低端设备上. 下面是一些有经验的安卓开发者应该熟悉的视图优化技术.

技术#1:优化布局中的视图.

布局是为活动和片段定义视图的XML资源文件. 因为它们的设计对应用程序性能非常重要, 谷歌写了一整本培训指南关于 优化布局层次结构.

让我们以以下布局为例:

这个布局由四个视图组成:一个根水平视图 LinearLayout 封装了一个 Image视图 和一个垂直 LinearLayout 包含两个 两个. 这就形成了一个三层的层次结构.

这个布局可以通过使用一个根将其层次结构扁平化为两个级别来优化 使用 放弃第二个 LinearLayout 完全. 的 Image视图 可以定位拥抱左边的父母吗 使用两个 可以拥抱的 Image视图 或者父结点的右边. 在速度和内存上的节省似乎不是单独的,但当应用到大量 列表视图 元素(例如),它可以快速地加起来并显著地影响性能.

技巧2:使用 标签在你的布局文件.

聪明的做法是使用 如果可能的话,在定义一个想要膨胀并添加到现有视图中的视图时 视图Group,例如 显示数据表格 or 列表视图. 这避免了创建不必要的 中间人 视图Group使用 or LinearLayout 只是为了封装子视图. 的 Tag只是父视图的占位符,它的子视图将被附加到父视图中. 在下面的示例中,只有 Image视图 将被添加到父视图中,从而消除了对封装视图的需要.

考虑以下布局:

<使用 xmlns:安卓="http://schemas.安卓.com/apk/res/安卓”
    安卓: 布局_width = " match_parent "
    安卓:布局_height="match_parent">
    
    


上述用法 使用,虽然是标准的做法,但可以通过使用 标签如下所示,从而优化这个布局:





现在我们少用了一个视图!

技巧#3:考虑使用视图Holder模式,但要谨慎使用.

使用视图Holder模式可以提高性能,但它不是一个完美的解决方案. 事实上,有些人会说这真的是一个 反模式. 在下一个问题中,我们将讨论视图Holder方法的优缺点. 这些问题都应该仔细考虑,然后再决定是否, 在哪里, 以及何时使用这种技术.

什么是视图Holder模式,它是如何使用的? 支持和反对使用它的理由是什么? 有什么替代方案吗?

视图Holder模式是安卓开发新手接触到的第一个模式之一, 如前所述, 我们还会进一步讨论, 有些人可能称之为反模式.

当我们希望在安卓 UI中显示项目列表时,我们通常使用:

  • 一个具体的 适配器视图 子类,如 列表视图, 显示数据表格等.
  • 一种基础数据集,通常是 pojo 或者一个 光标 (一组数据库行)
  • An 适配器 类,负责用指定的数据元素创建和填充视图

适配器视图 试图回收不再显示在屏幕上的视图. 这个简单但有效的技术可以让应用程序避免:

  • 产生垃圾收集的成本
  • 导致版面膨胀的成本

另一项可以避免的额外费用与呼叫有关 视图.find视图ById () 重复地在布局中定位子视图. 调用 视图.find视图ById () 是昂贵的,因为相当大的块的布局(一个层次结构)必须遍历在每个调用,以找到所需的子视图在一个潜在的复杂布局. 当快速滚动带有嵌套布局的列表时,可能会出现明显的延迟, 这给大多数开发人员留下了一个丑陋的问题来寻找解决方案.

进入 视图Holder 缓存模式. 但首先,让我们从历史的角度来看. 在安卓 2.2 (Froyo), Dalvik虚拟机和它的垃圾收集器的性能是令人沮丧的, 正是在这种情况下,为了帮助解决这个问题,视图Holder模式应运而生.

然而, 包括JIT编译器和垃圾收集器的巨大改进, 不缓存的代价 视图.find视图ById () 已经大大减少了(尽管从开发人员的角度来看,这仍然是值得的,而且并不昂贵). 因此,视图Holder已成为一种不太必要的方法, 考虑到它的一些负面影响,哪个是特别有问题的, 如:

这是 谷歌说的最新的 简单地说,是关于视图Holder的. 定义一个类来缓存的结果 视图.find视图ById ():

静态类视图Holder {
  		Text视图文本;
  		Text视图时间戳;
  		Image视图图标;
  		ProgressBar进展;
  		int位置;
}

然后在 get视图 () ,缓存它的结果:

视图Holder 持有人 = new 视图Holder();
持有人.icon = (Image视图) convert视图.find视图ById (R.id.listitem_image);
持有人.text = (Text视图) convert视图.find视图ById (R.id.listitem_text);
持有人.时间戳= (Text视图) convert视图.find视图ById (R.id.listitem_timestamp);
持有人.progress = (ProgressBar) convert视图.find视图ById (R.id.progress_spinner);
convert视图.setTag(持有人);

精明的开发人员认识到视图Holder是一个通过调用来填充的结构体 视图.find视图ById (). 视图Holder结构体被存储在父视图通过 视图.setTag (). 当回收一个视图时,我们可以点击视图Holder缓存:

视图Holder 持有人 = (视图Holder) convert视图.getTag (); 

现在,这种技术对于编写教程非常有用. 但是,例如,当您需要添加 onclicklistener, 根据状态变化改变绘图等, 您最终会让您的适配器类做大量它不应该做的工作.

我们能做些什么改变呢? 引用 联系适配器 代码,我们将修改膨胀的视图(在本例中 LinearLayout)将子视图缓存在 单独的关注,父视图本身:

@Override
public 视图 get视图(int position, 视图 convert视图, 视图Group parent) {
   联系 联系 = m联系s.(位置);
   联系视图视图= (联系视图) convert视图;
   If (视图 == null) {
       //“膨胀”我们的联系人.XML视图的出现.
       LayoutInflater充气器= (LayoutInflater)
           mContext.getSystemService(上下文.LAYOUT_INFLATER_SERVICE);
       视图 = (LinearLayout)膨胀器.充气(右.布局.接触,零);
        }
   //绑定联系人数据到适当的子视图布局.
   视图.setModel(接触);
   返回视图;
}

我们现在需要做的就是编辑我们的联系布局,并将其根元素替换为 联系视图 (如下所示)而不是 LinearLayout说,. 就是这样! 我们现在有了适当的关注点分离, 单一用途(更少杂乱)的类, 我们避免使用 视图.setTag ()视图.getTag () 在缓存子视图时没有开销的方法.

公共类联系视图扩展LinearLayout {
  私人接触模型;
  私人Text视图名称;
  私人Text视图电话;

  @Override
  onfinishinflation () {
  	这.的名字 = (Text视图)视图.find视图ById (R.id.的名字);
    这.电话= (Text视图)视图.find视图ById (R.id.电话);
  }
  
  public void setModel(联系 model) { 
    这.模型=模型; 
    bindModel ();
  }
  
  private void bindModel() {
    这.的名字.setText(模型.的名字);
    这.电话.setText(模型.电话);
  }
}

问:什么是ANR? 是什么引起的?如何避免?

ANR 指的是臭名昭著的安卓 应用程序没有响应 对话框,当应用程序花费太多时间在主线程上计算时,可以触发. 主线程处理安卓 UI,所以在那里做更多的工作会变慢 响应性. 因此,当你不再后台长时间运行任务时,ANR经常是一种鞭笞.

导致ANR的任务示例包括:

  • 上传/加载数据到/从云
  • 保存/加载缓存数据到/从磁盘
  • 对数据进行排序、过滤和搜索

这些操作的共同之处在于它们可能都很慢. 它们通常是资源限制的, 这意味着他们经常需要时间, 有时比预期的要长得多.

记住这一点, 任何要执行的与ui无关的工作, 特别是上述类型的资源约束任务, 应该在后台线程上完成吗. 安卓有几种方法来完成后台工作,并且已经衍生出一些不错的第三方开源库.

存在几个线程选项,每个都有自己的优点和缺点. 异步计算本身就很复杂,这些类和接口试图简化这方面的工作. 看看谷歌的 进程和线程 更多详细信息的指南.

让我们来看看安卓中一些更有用的线程选项:

AsyncTask

AsyncTask 是一个帮助类,让您生成一个简短的后台操作. 它最常用来在UI线程上显示结果. 这通常是新手开发人员在处理异步性时学习的第一个类, 因为它避免了直接设置和使用线程.

不幸的是, AsyncTask 有什么严重的问题吗. 当需要使用其他更高级的线程选项时,它已经成为了一种支持. 多年来,谷歌在运行时行为方面发生了转变 AsyncTask,从第一次连续运行(与其他 asynctask 在单个后台线程上),以并行方式运行,然后回到串行方式运行! 这意味着,如果并发的类型(i.e.、串行和. 并行)对你的应用很重要, 您必须检查正在运行的SDK版本的安卓使用 AsyncTask. 开发人员最好使用 处理程序线程 or 遗嘱执行人 作为一个结果.

线程

线程 类是安卓最基本的执行环境,有自己的调用栈, 参数, 和局部变量. 每个应用程序都有一个主线程(用于用户界面)和系统线程组中的其他线程. 你可以(a)子类 线程 并在 run () 方法或(b)传递a 可运行的 返回到它的构造函数,然后通过调用其 start () 方法. 一旦启动,线程可以让位给其他线程,也可以休眠. You can’t externally stop a thread though; your only options are to interrupt it, 等待它自己完成, or 加入() it.

处理程序线程

然而线程在默认情况下没有循环器 处理程序线程 是一个线程有一个 电影 附加. 环形器提供一个 处理程序 这允许消息在线程之间传递. 处理程序也允许执行 可运行的 其附加线程上的任务,可以是立即的,也可以是稍后的某个时间点上的.

下面是实例化的方法 处理程序线程 在上面发布要执行的任务:

类Voting活动 {
    private 可运行的 processVotes = new 可运行的() {
        Public void run () {
        }
    };
    
    public void onCreate (Bundle savedInstanceState) {
        处理程序线程 = new 处理程序线程(“投票任务”);
        处理程序线程.开始();
        处理程序 = new 处理程序(处理程序线程.get电影 ());
        //现在让我们在刚创建的新线程上尽快执行一个可运行的任务:
        处理程序.邮报》(新可运行的 () {
            Public void run () {
                //接受投票.
            }
        });
        //让我们也安排一个任务在未来的新线程上执行10秒:
        处理程序.postDelayed (processVotes, 10000);
    }
}

下面是我们如何设置一个处理程序线程来依次处理消息:

类Download线程扩展处理程序线程 {
    int START_MSG = 0;
    public static final int STOP_MSG = 1;

    Download线程(字符串名称){
        超级(名称);
    }

    @Override
    public void h和leMessage(Message msg);
        开关(味精.什么){
            案例START_MSG:
                / /开始下载...
                打破;
            案例STOP_MSG:
                / /停止下载...
                打破;
            默认值:
                打破;
        }
    }
}

然后我们可以产卵和使用这个线程如下:

Main活动类扩展活动 {
    public void onCreate (Bundle savedInstanceState) {
        //设置我们的Download线程接收消息.
        下载线程下载线程= new Download线程("Image Downloader");
        download线程.开始();
        处理程序download处理程序 = new处理程序(下载线程.get电影 ());
    }
    
    public void startDownloading() {
        download处理程序.sendEmptyMessage (Download线程.START_MSG);
    }
    
    public void stopDownloading() {
        download处理程序.sendEmptyMessage (Download线程.STOP_MSG);
    }
}

遗嘱执行人Service线程Pool遗嘱执行人

线程Pool遗嘱执行人 实现了 遗嘱执行人Service 接口,它在几个池化线程中的一个上执行已提交的任务. 当执行许多任务时,由于每个任务调用的开销减少,线程池通常可以提高性能. 如果您需要异步执行许多任务, 使用这个机制,你可以很容易地生成工人. 谷歌指出, 线程Pool遗嘱执行人 有点像可配置的厨房水槽吗, 并且鼓励开发人员使用预先配置好的版本,例如 newCached线程Pool (), newFixed线程Pool ()newSingle线程遗嘱执行人 ().

问:什么是装载机? 什么时候和为什么使用它们?

在不断寻求从主线程中卸载工作的过程中,安卓引入了加载器(loader) 加载程序Manager加载程序 类). 加载器简化了通常提供适配器的活动和片段中的数据的异步加载. 它们监视数据源,并在内容更改时交付新的结果. So, 而不是阻塞和等待数据到达(从您的云或磁盘, 例如), 使用一个加载器. 看到谷歌的 加载器指南 为更多的细节.

Q:什么是RxJava ?为什么它这么酷?

并不是每个安卓开发者都知道这一点, 所以当他们这么做的时候,我们的书里会给他们加分. 这是一个巨大的创新,也许是我们文章中最令人兴奋的部分. RxJava Netflix的开源端口是微软的吗 反应性的扩展 图书馆. 反应性编程 编程范例是否与数据流和变化有关. 反应式编程已经出现一段时间了,但是RxJava还没有. RxJava对于编写同步/异步、基于事件的可观察序列非常有用. 它是为高效查询和消费数据而设计的(动态).

RxJava不是一个特定于安卓的库,但可以使 巨大的 对安卓应用的影响,取决于它的使用方式. 它对于需要低延迟的并发和/或异步应用程序非常有用. 例如, 它的一个主要用例是异步加载数据,而无需过多考虑线程, 处理程序, 或执行人. You might use RxJava to load data f或者一个dapters; e.g., 在UI线程上订阅感兴趣的数据, 安排要在后台线程上执行的工作, 然后在UI线程上观察显示的结果.

RxJava允许你链接数据和事件, 然后创建选择的序列, 过滤器, 转置, 组成, 在最终的观察者收到结果通知之前合并数据. 这里我们不可能深入讨论RxJava, 但我们之所以想提及这一点,是因为精英开发者应该意识到这一点. 你可以阅读更多有关它的信息 在这里.

问:如何从网上缓存大量的大图像?

如果你正在开发一个图像库应用程序,如Instagram或Pinterest, 从服务器缓存许多(大型)映像变得非常关键. 为了追求最佳性能, 您希望快速呈现图像, 因此,缓存它们以避免从网络重新加载它们是必要的. 因为你不能在RAM中缓存太多的大的几兆字节的图像(因为安卓内存是不稳定的,是一个有限的资源), 你真的别无选择,只能将图像缓存到磁盘上(闪存).

不需要编写自己的缓存类,您可以利用和包装 DiskLruCache. 这是一个必不可少的开源解决方案,经验丰富的安卓开发者应该意识到这一点. 它可以用于将任何类型的数据缓存到文件系统目录, 由您指定的大小限制.

除了安卓适当

谷歌的安卓团队雇佣了很多优秀的工程师, 它不能为开发人员面临的新问题提供或预期所有可以想象到的解决方案. 这就是第三方开源,甚至其他谷歌团队的切入点.

因此,精明的安卓开发人员将熟悉近年来出现的许多更有价值的库. 这些技术可以用来为旧手机升级新的安卓系统功能, 增加现有功能, 或者引入新功能.

那些将新的安卓功能扩展到老款手机的公司, 然而, 随着用户升级到 更新的安卓版本和设备. 但也就是说,安卓开发者确实有一个 安卓设备、版本和品牌的巨大分裂性 与iOS不同.

问:有哪些更有用的安卓开源库,你如何利用它们?

有许多可用的开源库和附加组件, 来自谷歌和其他地方, 这是经验丰富的安卓开发者通常会利用的. 一些更有用的方法包括:

  • ActionBarSherlock ActionBarSherlock是安卓的扩展 支持库 设计的便利使用操作栏设计模式跨越所有版本的安卓与单一的API. 它允许您轻松地开发一个应用程序与操作栏的每个版本的安卓 2.x和了.
  • DiskLruCache -如上所述, DiskLruCache是一个强大的, 然而,简单的, 最近最少使用的(LRU)缓存实现,用于存储数据 在磁盘上,池大小有限制.
  • 浓缩咖啡谷歌于2013年10月宣布 仍然在开发人员预览, 浓缩咖啡是一个新的UI测试框架,其目标是让开发人员轻松编写可靠的UI测试. 最重要的是,浓缩咖啡不再需要考虑多线程测试的复杂性. 浓缩咖啡已经被许多谷歌应用程序使用(Drive, Maps,谷歌+等).
  • 番石榴 谷歌的番石榴项目包含了谷歌内部使用的几个核心库:collections, 缓存, 原语支持, 并发库, 常见的注释, 字符串处理, I/O, 和一些非常有用的类的大杂烩. 看到 番石榴的维基 的更多信息. 它的目的是使Java“更愉快”,改进 防御性编程,添加优化,提高效率. 它填充并改进了集合等公共类, 数学, 反射, 字符串, 范围, 哈希, I / O和更多.
  • NineOld安卓s - NineOld安卓s推出了全新改进的安卓 Honeycomb系统.0)动画API可用于旧版本1.0和向前兼容的最新版本的安卓. 在《PT视讯官网》之前的动画是非常有限的. 新的API提供了更强大的功能和灵活性来动画对象,并通过旋转来重新定位视图, 翻译, Alpha和scale基元, 例如. 该库提供了一个可跨所有安卓版本工作的包装器.
  • 协议缓冲区 谷歌的协议缓冲区是语言中立的, 平台无关的, 序列化结构化数据的可扩展机制, 它提供了JSON或XML的可行替代方案. 这是一种传输对象数据的有效方法, 例如,在原始二进制格式中,不需要(un)marshal. 用谷歌的话说,数据传输是“更小、更快、更简单”的.
  • RxJava -如上所述, RxJava是一个响应式扩展,可以让你创建异步, 使用可观察序列的基于事件的代码, 在很多情况下,这是无价的.
  • 凌空抽射 - 凌空抽射是一个相对较新的谷歌库 于2013年5月在谷歌I/O上推出 这使得安卓应用的联网更快更容易. 奇怪的是, 除了源代码,谷歌还没有发布自己的教程或文档, 这让一些开发者怀疑或谨慎, 但也有几个人写了这样的教程 . 高亮显示包括一个自动加载图像的视图, 具有优先级的HTTP请求队列, 以及自动选择特定于安卓版本的最佳HTTP库.

调试和调优

有经验的开发人员依赖于伟大的工具来帮助他们构建伟大的软件, 特别是为了测试和优化的目的. 安卓一开始提供这些服务的速度有点慢,但它的工具箱终于填满了. 安卓提供了问题的运行时检测,附加的类可以帮助检测问题. 还有一些外部工具,比如 摘要讨论 查看内存使用情况,查找泄漏,查看线程使用情况,查看视图层次结构等.

问:什么是“不保留活动”开发选项?为什么它有用?

谷歌提供了大量的运行时 调试选项 for devices that can be activated under Settings > Developer options. 一个更有用的方法是 不要让活动 当用户离开activity时,立即销毁它. 它对于测试活动的保存和恢复非常有用.e., onSaveInstanceState(包)onCreate(安卓.os.包) 代码路径),否则很难触发. 它还可以发现活动生命周期的其他对称问题, 如正确打开和关闭资源之间 onResume ()onPause () 回调,例如.

问:什么是StrictMode,为什么它有用?

在不断提高应用程序响应性和保持UI平稳运行的过程中, StrictMode 是一个很有价值的安卓工具,可以帮助检测偶然的磁盘和网络访问的主线程(或任何线程).

在你的应用的开发版本中(永远不要在发布的应用中启用StrictMode!), 你告诉安卓你感兴趣的问题是什么,并定义应用的“惩罚”(i.e.如果它们被发现,该怎么办. 然而,并不是它发现的每个问题都需要修复, 你也不能肯定它会找到所有的问题, 它提供了一个非常有用的窗口来了解你的应用的缺陷(如果有的话).

下面是如何在你的应用程序的onCreate方法中启用StrictMode:

public void onCreate() {
    //仅在开发应用程序时启用!
    如果(DEVELOPER_MODE) {
        //告诉安卓你想检测什么线程问题,当发现时该做什么.
        StrictMode.set线程Policy(新StrictMode.线程Policy.构建器()
            .detectDiskReads ()
            .detectDiskWrites ()
            .detectNetwork() //或使用 .detectAll()用于所有可检测的问题
            .penaltyLog ()
            .build ());
        //告诉安卓你想要检测什么VM问题,当发现时该做什么.
        StrictMode.setVmPolicy(新StrictMode.VmPolicy.构建器()
            .detectLeakedSqlLiteObjects ()
            .detectLeakedClosableObjects ()
            .penaltyLog () //记录问题
            .penaltyDeath() //然后杀死应用程序
            .build ());
    }
    超级.onCreate ();
}

问:什么是“lint”工具? 它是做什么的?你会如何使用它?

线头 是一个安卓工具,扫描你的项目,并生成一个详细的报告,包含错误和警告在你的代码和资源文件,你可能考虑修复. 它不是完美的, 有时它报告的是假阳性(顶级开发人员知道要有所保留), 但它仍然是一个有用的工具. 例如,它可以:

  • 检测未使用的文件和资源,以减少应用程序膨胀
  • 告诉你应该在哪里回收 TypedArrays 在使用后
  • 确定您可能在何处透支覆盖视图的背景
  • 加上许多其他问题

您可以使IDE在编辑源文件时提醒您这些问题, 但无论如何,在命令行上运行lint以定期生成完整的报告通常是一个好主意, 或者作为自动构建的双产物. 有关更多信息,请参见 使用lint改进代码.

总结

我们只是触及了安卓应用开发的表面, 突出平台的一些更重要的方面和细微差别, 以及杠杆工具.

鉴于安卓的复杂性, 手机应用程序开发人员可能需要数年时间才能真正精通. 安卓拥有巨大的市场渗透率和丰富的框架. 考虑到他们的需求和成为绝地大师所需要的时间,寻找安卓绝地大师是一个挑战. 我们希望你在这篇文章中提出的问题能在你寻找精英的时候对你的目标有所帮助, 精华的开发人员.

精选PT视讯 安卓出版物

安卓顶级开发者的需求量很大.

开始招聘