美文网首页
Android中一些细碎问题的严肃探究

Android中一些细碎问题的严肃探究

作者: 拉丁吴 | 来源:发表于2016-08-19 20:18 被阅读287次

    一直以来,andorid开发中会面临各种小问题,比如使用在某处为了图方便用了static修饰符是否合适?明明重写了onTouch()方法,却无法被系统调用,或者只匆匆调用一次完事。又比如有时候明明调用了系统API,键盘却还是无法正常显示.....这一切的背后,到底是人性的扭曲还是道德的沦丧.........,好,我们开始。

    键盘显示问题

    关于键显示的问题,有如下几个api接口:
    第一类

      boolean   showSoftInput(View view, int flags)
      boolean   showSoftInput(View view, int flags, ResultReceiver resultReceiver)
    

    网上大多吐槽这个这类api有问题,我们看看api对于第一个参数的描述:

    • @param view The currently focused view, which would like to receive soft keyboard input.

    稍微解释一下,就是当前的view应当是已经获得焦点的,并且是可以接受输入,也就是说当前的view应该是EditText或者是其子类才对。你传个button是交不了货的。

    第二类api

    1   void   toggleSoftInput(int showFlags, int hideFlags)
    2   void  toggleSoftInputFromWindow(IBinder windowToken, int showFlags, int hideFlags)
    

    网上往往说这个api可行,可以正常显示键盘,我们看看api的描述:

    • This method toggles the input method window display.
      If the input window is already displayed, it gets hidden.
      If not the input window will be displayed.
      如果键盘没显示,那么就显示,否则就隐藏键盘。(由于参数是一些标志,所以没有什么坑)。也就是说,这个键盘的显示是跟当前界面组件基本没有什么关系。

    两种方式推荐第一种。

    static 修饰符的使用

    Android开发中,使用static修饰字段或者方法的情况并不少见,而static修饰的东西的特性如下:

    • 修饰的变量,方法只属于类,并且在类加载阶段就读入内存
    • 有独立的内存区域,该类的对象实例共享一个静态变量。(一般的对象变量会随着每个对象的创建而copy一份)
    • static修饰的代码块,在类加载阶段执行一次。
    • static修饰的对象生命周期很长

    用static修饰的字段或方法是很容易调用的,但者绝对不是使用static的理由,

    • 一旦使用static修饰类中的某个对象,也就意味着,即使类的对象实例被回收了,类中静态对象依然存在。
    • 一旦使用static修饰变量,也就意味着,你准备好了当一个对象的实例修改了变量,那么另一个对象也会被影响。
    • 一旦使用static修饰方法,那么也就意味着方法内部不能使用this,不能调用非静态方法(对象实例的方法);

    与这个相关的还有final private 等等,虽然他们的作用都很清楚,但是在项目应用中,他们的应用场景未必是清晰的,有机会,我会想去整理这一块的内容。

    onTouch()方法异常

    在实际使用中,我们可能用它做一些手势判断等等操作,但是有时候ACTION_DOWN被调用一次之后,就没有下文了。
    这往往是因为你在重写的方法中,返回了false,这意味着你不消费事件,那么系统在把ACTION_DOWN事件传给你之后,收到你的不消费该事件的提醒之后,后续的事件就不传给你了。这里主要是在事件分发中做的控制。关于源码分析,有兴趣的同学,可以查看《Android开发艺术探索》。

    RecycleView的删除错乱

    问题主要处在notifyItemMoved(int position)这些新的api中,主要是因为

    • Note that unlike ListView, RecyclerView will not call this method again if the position of the item changes in the data set unless the item itself is invalidated or the new position cannot be determined. For this reason, you should only use the position parameter while acquiring the related data item inside this method and should not keep a copy of it. If you need the position of an item later on (e.g. in a click listener), use getAdapterPosition() which will have the updated adapter position. Override onBindViewHolder(ViewHolder, int, List) instead if Adapter can handle effcient partial bind.

    主要是告诉你,当adapter位置有变化的时候,使用getAdapterPosition()可以得到更新的变化,而onBindViewHolder()中的position并不会更新

    相关文章

      网友评论

          本文标题:Android中一些细碎问题的严肃探究

          本文链接:https://www.haomeiwen.com/subject/qxtbsttx.html