Android开发常见错误

  我们在平时Android开发的过程中,肯定会遇到各种各样的编译问题,有时候确实是我们的代码有问题;但有时候却是我们得AS配置有问题,因此本篇文章将用来一步一步的记录我在工作和学习中遇到相关的配置的问题。

1.Instant Run 导致

  当安装了新版本的AS,或者新开项目,你在编译的过程中可能会突然报以下错误信息:


image.png

解决办法就是AS的配置问题:
Android Stuido->Preferences->搜索栏搜索“Instant Run”->关闭Instant Run
就可以解决这个问题。

解释下Instant Run
Instant Run开启会加快编译,这就是它开启的作用。

  传统情况下,我们修改程序后重新运行一次程序需要经历 代码重新编译 -> 停止程序 -> 重新安装 -> 重新启动 这样一个过程,而Instant Run则尝试只将程序变更的部分部署到手机上,尽量避免重新安装或重新启动程序,以此大大提升调试程序的效率。
可以看到,运行的三角形旁边多了一个闪电符号,这就说明现在可以使用Instant Run了。


image.png

  但是随着项目的运行,发现了一个特别恶心的事,apk卸载之后,重新运行,速度会特别慢,之后就不会出现了,到今天,运行一次要10s左右,实在是受不了了,最后发现问题还是出现在Instant Run上,把Instant Run关闭了之后,再把apk卸载了,运行速度马上就正常了,2s左右吧,今天把这个记录下来,未免之后再次碰到这个问题。

2.Mac Os 升级 导致 git 命令失效

有时候手残进行了Mac Os 升级之后,你会遇到各种奇怪的问题,然后题主昨晚就进行了Os升级,升级之后,再次进行AS进行git 操作的时候,奇怪的事情就出现了,居然出现如下错误信息:

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

很是纳闷,没修改啥关于CommandLineTools的东西啊。然后各方了解了一下:
大致是OS升级后,对应的CommandLineTools并没有伴随下载。

解决办法

在命令行中执行 xcode-select --install ,然后会启动下载并安装Command line tools OS) for Xcode,注意,这个命令并不会下载完整的Xcode,但是下载依然会很慢,如果你有苹果开发者账号的话,你可以去http://developer.apple.com/downloads
然后根据提示进行安装相应的东西,就可以完美解决了。

3.InputMethodManager导致crash

我们在关于与软键盘弹出弹入的界面的时候,肯定想增强其弹出弹入的自然性,关于软键盘弹出这里不做介绍,只介绍关于关闭软键盘的crash情况。
在做关闭软键盘的操作,我们自然的写法必然如下:

((InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE))
            .hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),
                InputMethodManager.HIDE_NOT_ALWAYS);
        getActivity().supportFinishAfterTransition();

一般这样是没有问题的,但是有时候也会有crash的情况出现,比如公司的项目就出现了这样的情况,log如下:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.IBinder android.view.View.getWindowToken()' on a null object reference
at com.sankuai.movie.movie.search.SearchBaseFragment.f(MovieFile:242)
at com.sankuai.movie.movie.search.SearchBaseFragment.onClick(MovieFile:195)
at android.view.View.performClick(View.java:6306)
at android.view.ViewPerformClick.run(View.java:24813) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6747) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInitMethodAndArgsCaller.run(RuntimeInit.java:455)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
哇,是不是挺可怕的,突然就来一个crash,让人摸不着头脑,还是空指针异常,按照常理来说,这个操作不会报空指针吧,我来解释下原因吧,引用官方文档对hideSoftInputFromWindow的介绍我们似乎就可以找到原因:

public boolean hideSoftInputFromWindow(IBinder windowToken,int flags)

Synonym for `[hideSoftInputFromWindow(IBinder, int, ResultReceiver)]without a result: request to hide the soft input window from the context of the window that is currently accepting input.

windowToken:IBinder: The token of the window that is making the request, as returned by View.getWindowToken().
大概意思就是指谁触发出软键盘,在隐藏软键盘的时候,由触发出的隐藏

这下知道为什么会crash了吧,就是我们在页面弹出软键盘的时候,不一定是由Activity的全局View触发,但也不排除由全局view触发,但是我们隐藏软键盘的时候,指定view中的特定view进行隐藏就会避免不必要的crash产生。
将上面的会产生crash的代码改成如下:

((InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE))
            .hideSoftInputFromWindow(etSearch.getWindowToken(),
                InputMethodManager.HIDE_NOT_ALWAYS);

便可解决此问题。

4.如何做浮点数的比较

做业务开发中,无非就是各种判断条件,但是对于整数,字符串等的比较是可以正常进行的,如果我们遇到浮点数的时候应该怎么进行尼。有的同学可能马上就要说我们可以将浮点数类型转换为String进行比较,但是你有没有想,我们要比较的是不定的浮点数,也就是可能通过大量计算的计算式,我们无法知道其精度为多少。
那么显然“==”“!=”是不能用了,那么就会有人提出来使用equals,下面给你看一个劲爆的例子:

Double a = Double.valueOf("0.0");  
Double b = Double.valueOf("-0.0");  
System.out.println(a.equals(b));  

结果居然是false,惊喜不,别着急还有更惊喜的:

 public static void main(String[] args) {
        Double a = Math.sqrt(-1.0);
        Double b = 0.0d / 0.0d;
        Double c = a + 1.0d;
        Double d = b + 2.0d;
        System.out.println(a.equals(b));
        System.out.println(b.equals(c));
        System.out.println(c.equals(d));
}

它会丧心病狂的全部返回为true.
在java里,a和b都属于NaN,因此便无法进行比较操作了;对于equals方法,是比较2个对象是否等值,而不是对象的值是否相等,所以equals方法设计的初衷根本就不是用来做数值比较的,因此我们不能想当然的认为equals是万能的.

接下来又会有同学进行反驳说,可以使用compareTo;
虽然说它在设计上是用于数值比较的,但它表现跟equals方法一模一样(对于NaN和0.0与-0.0),但是我们在进行浮点数比较的时候,一般是至少有一方是经过表达式计算返回的值,我们必定会存在舍入误差,因此也不建议直接使用Float.compareTo和Double.compareTo方法.

通过上面的分析,针对的给出解决方案就是,避免NaN,然后化无穷为有穷,给定精度值,进行比较
类似的给出float和double的封装方法参考:

//精度值
private static final double EPSILON = 0.000001;
 /**
     * 比较两个浮点数是否相等
     * @param f1
     * @param f2
     * @return
     */
public static boolean isEquals(float f1,float f2) {
      if (Math.abs(f1 - f2) < EPSILON) {
          return true;
      } else {
          return false;
      }
}
 /**
     * 比较两个浮点数是否相等
     * @param d1
     * @param d2
     * @return
     */
public static boolean isEquals(double d1,double d2) {
      if (Math.abs(d1 - d2) < EPSILON) {
          return true;
      } else {
          return false;
     }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,709评论 2 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,918评论 25 707
  • 东北菜的代表作-杀猪菜,它可是盼一年的美味啊,可惜我家虽然养过猪,却没杀过猪,真是遗憾,这里讲我看到的听到的吧。 ...
    二货纯纯阅读 231评论 0 0
  • 文:哑白 1 人(学名:Homo sapiens,意为“有智慧的人”),是一种灵长目人科人属的物种。线粒体DNA与...
    啞白先生阅读 812评论 10 15
  • 那些荒废的,逗留的,侥幸的,曲折的,罪恶的光阴,毋庸置疑,总有一天都会归于正途。 胡途从出生到他17岁这段时间从没...
    陶之夭夭1阅读 487评论 0 2