Android开发者不得不知的13个注意事项

本贴最后更新于 3499 天前,其中的信息可能已经沧海桑田

在安卓开发中,相信大家都会遇到各种各样的问题,掌握一些开发技巧,并有效的避免这些坑还是灰常重要的。Android 老鸟们应该在夜以继日的码农生涯中总结了不少坑和避开这些坑的方法,菜鸟们就比较可怜了,刚踏入码农界,一无所知,常常被这些坑伤滴遍体鳞伤。本文是小编在 android 开发教程网上搜罗的一些 android 开发中比较常见的坑和解决办法,菜鸟们都看过来吧

  1. 在 Activity 还没完全显示时,弹出 PopupWindow 或者 Dialog 崩 Activity not running 错误

解决方案: 重写 onWindowFocusChanged 方法

public void onWindowFocusChanged(boolean hasFocus) {

if (hasFocus) { if (!mIsInitData) { initData(); mIsInitData = true; } } super.onWindowFocusChanged(hasFocus);

}

protected void initData() {
// 在此处编写弹出 Popup 或者 Dialog 的方法
}

  1. 在 library 中使用 switch 语句处理 id 时报错

产生原因:library 中生成的 R 文件中生成的 id 没有用 final 修饰;
解决方案:使用 if else 替换 switch

  1. 不要在 Application 中缓存任何数据,NoPointException

产生原因:一般情况下不会出现异常,当按下 Home 应用隐藏到后台,长时间未使用,导致应用被回收,当再次启动时,Application 会重新创建,而 Activity 此时再向 Application 里取数据,异常发生

解决方案:将数据缓存到 sp 或者数据库或者 sd 卡。或者在使用 Application 缓存数据时,进行 null 判断

  1. AsyncTask 只能执行一次

  2. 提取一个 BaseActivity,里面进行一些统一处理,能让你的代码更简洁。

public abstract class BaseActivity extends Activity implements OnClickListener {

private boolean mIsInitData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void setContentView(int layoutResID) { super.setContentView(layoutResID); initView(); } @Override public void onWindowFocusChanged(boolean hasFocus) { if (hasFocus) { if (!mIsInitData) { initData(); mIsInitData = true; } } super.onWindowFocusChanged(hasFocus); } protected void initData() { } protected abstract void initView(); /** * 获取View * * @param id * @return */ @SuppressWarnings("unchecked") protected <T extends View> T mGetView(int id) { return (T) findViewById(id); } /** * 获取Button的实例 并绑定点击事件 * * @param id * @return */ protected Button mGetButtonSetOnClick(int id) { Button btn = (Button) findViewById(id); btn.setOnClickListener(this); return btn; } /** * 获取ImageView的实例 并绑定点击事件 * * @param id * @return */ protected ImageView mGetImageViewSetOnClick(int id) { ImageView image = (ImageView) findViewById(id); image.setOnClickListener(this); return image; } /** * 获取View的实例 并绑定点击事件 * * @param id * @return */ protected View mGetViewSetOnClick(int id) { View view = (View) findViewById(id); view.setOnClickListener(this); return view; } /** * 获取TextView中的文本信息 * * @param tv * @return */ protected String mGetTextViewContent(TextView tv) { return tv.getText().toString().trim(); } /** * 获取EditText中的文本信息 * * @param et * @return */ protected String mGetEditTextContent(EditText et) { return et.getText().toString().trim(); } protected void showHintMsg(int sid) { MToast.showToast(this, getResources().getString(sid)); } protected void showHintMsg(String sMsg) { MToast.showToast(this, sMsg); }

}

  1. Toast 定义为全局,避免一直不断的卡卡卡卡。

public class MToast {
private static Toast mToast;

private static TextView tv_content; public static void showToast(Context context, String msg) { try { if (mToast == null) { mToast = Toast.makeText(context, msg, Toast.LENGTH_SHORT); mToast.setGravity(Gravity.TOP, 0, DensityUtil.dip2px(context, 3)); View view = View.inflate(context, R.layout.m_toast, null); tv_content = (TextView) view.findViewById(R.id.tv_content); mToast.setView(view); tv_content.setText(msg); } else { tv_content.setText(msg); } mToast.show(); } catch (Exception e) { // TODO: handle exception } }

}

  1. 标题栏样式抽取,抽取思路大概有两种:
    第一种:用标签在 xml 布局时引入
    第二种:自定义一个 TitleView。
    不仅仅是标题栏,字体大小,主题颜色,能抽取的都统一处理。

  2. TextView.setText();中要显示 int 类型的值,用 String.valueOf()转,不要直接 124+“”,不知道为什么这样的童鞋,去看看源码就知道为什么了。

  3. 退出应用方式:
    1)直接杀死进程
    2)在 BaseActivity 中注册一个广播,发送广播关闭
    3)定义一个全局容器存储 Activity 应用,退出时遍历退出(不推荐)

  4. 一个功能分几个页面处理时,使用 Dialog 模拟 Activity 避免了数据在 Activity 之间传递。

  5. 手机重启,通过不断的 new 空 Toast,导致系统奔溃而重启,想想竟有一种无言以对的感觉,原来 Toast 还可以这么玩
    public void onClick(View v){
    while(true){
    Toast toast = new Toast(this);
    toast.setView(new View(this));
    toast.show();
    }

}

  1. View 类中的 setSelected(boolean)方法结合 android:state_selected="" 用来实现图片选中效果,自定义标题栏用起来很方便;
  2. EditText 中有个 android:digits="" 属性,用来自定义输入的字符类型,比如输入身份证只能是数字和 x 或者 X 使用 android:digits="1234567890xX" 就轻松搞定了,不用再在代码里面进行校验了;

以上就是 android 中,比较常见的一些问题,及出现这些问题的原因、解决办法,可能还有整理得不是很全面的地方,欢迎大家补充分享。

相关文章:《Android 学习之 JSON 解析详解》
http://www.maiziedu.com/group/article/10955/

  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖 • 1 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖 • 1 关注
  • IT
    4 引用 • 13 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 51 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 635 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    134 引用 • 1127 回帖 • 111 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 160 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 28 回帖 • 1 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    86 引用 • 165 回帖 • 1 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 563 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 118 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 442 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • Word
    13 引用 • 41 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 445 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 470 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 180 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 15 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 1 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 1 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 397 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 143 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    301 引用 • 768 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖 • 1 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 523 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    167 引用 • 597 回帖 • 3 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 312 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    37 引用 • 157 回帖