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

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

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

    85 引用 • 139 回帖
  • 互联网

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

    98 引用 • 344 回帖
  • IT
    4 引用 • 13 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 工具

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

    288 引用 • 734 回帖
  • PostgreSQL

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

    22 引用 • 22 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1795 回帖
  • Solo

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

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

    1435 引用 • 10056 回帖 • 489 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 105 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 484 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 147 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 65 回帖 • 445 关注
  • 七牛云

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

    27 引用 • 225 回帖 • 163 关注
  • 996
    13 引用 • 200 回帖 • 10 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 637 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    288 引用 • 4485 回帖 • 663 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 2 关注
  • Caddy

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

    12 引用 • 54 回帖 • 159 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    492 引用 • 926 回帖
  • 反馈

    Communication channel for makers and users.

    123 引用 • 913 回帖 • 250 关注
  • NetBeans

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

    78 引用 • 102 回帖 • 683 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖 • 1 关注
  • 阿里云

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

    89 引用 • 345 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    196 引用 • 540 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 1 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 694 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 27 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 715 关注