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

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

在安卓开发中,相信大家都会遇到各种各样的问题,掌握一些开发技巧,并有效的避免这些坑还是灰常重要的。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 的商业操作系统。

    84 引用 • 139 回帖
  • 互联网

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

    96 引用 • 330 回帖
  • IT
    4 引用 • 13 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖 • 1 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖 • 1 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 154 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 44 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖 • 2 关注
  • 自由行
    2 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • Scala

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

    13 引用 • 11 回帖 • 109 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 292 关注
  • 博客

    记录并分享人生的经历。

    270 引用 • 2386 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 688 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 593 关注
  • Thymeleaf

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

    11 引用 • 19 回帖 • 318 关注
  • iOS

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

    84 引用 • 139 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 641 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • abitmean

    有点意思就行了

    25 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 292 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    25 引用 • 217 回帖 • 159 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 445 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 611 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 12 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 625 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 237 关注