TV app开发问题汇总

1.方法 变量 需要添加关键字

场景:有时候偷懒写方法直接void 方法名(); 规范来讲每个方法前都需要添加关键字,尤其对public /protected 关键字使用前要仔细考虑,传递进来的参数要进行校验;

2.没有用的文件/类 不用提交

场景:其实吧 这个指在代码提交到server之前,自己要进行code review 确保提交代码的质量,对无用的类/配置文件等不要进行提交;

3.try catch 要捕获具体的异常,最好不直接用exception;

场景:总之这么写比较规范啦啦啦

4.在post 中使用requestFocus();时候注意 可能会夺取焦点;

场景:在说这个问题时候我想问一个问题,View 如果是GONE 状态 里面的 控件 还会获取焦点么,还会响应么? 回答可能会。

举个栗子!

 

有两个View A /B  , B 覆盖在A 上面, B 每1分钟 从接口获取一次数据 同时requestFocus,点击返回 此时 B GONE   A VISIBLE , 此时焦点状态A 获取了焦点, 当数据过来时候 B 调用了requestFocus(),B会获取焦点 即使B此时GONE了。

5.在postDelay 使用时候 注意进行null判断

场景:postDelay(run, 5 * 1000);   在run 中执行的操作是让一个控件隐藏,BUT 在5 * 1000 中可能会发生很多事情,譬如界面finish();控件也销毁了,这个时候执行run 如果不进行null 判断会崩溃哦!

6.动态调用setTextSize时候要注意

场景:动态设置文字大小videoName.setTextSize(getResources().getDimensionPixelSize(R.dimen.x32)); 如果你在不同的分辨率中去看显示效果,你会发现动态设置的文字大小和xml 设置的文字大小有时候会不一样。之所以出现这样的原因是因为,请看源码:

/**
 * Set the default text size to the given value, interpreted as "scaled
 * pixel" units.  This size is adjusted based on the current density and
 * user font size preference.
 *
 * @param size The scaled pixel size.
 *
 * @attr ref android.R.styleable#TextView_textSize
 */
@android.view.RemotableViewMethod
public void setTextSize(float size) {
    setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}

默认使用的是TypedValue.COMPLEX_UNIT_SP

/**
 * Set the default text size to a given unit and value.  See {@link
 * TypedValue} for the possible dimension units.
 *
 * @param unit The desired dimension unit.
 * @param size The desired size in the given units.
 *
 * @attr ref android.R.styleable#TextView_textSize
 */
public void setTextSize(int unit, float size) {
    Context c = getContext();
    Resources r;

    if (c == null)
        r = Resources.getSystem();
    else
        r = c.getResources();

    setRawTextSize(TypedValue.applyDimension(
            unit, size, r.getDisplayMetrics()));
}

源码中有一个int unit 属性, 继续查看TypedValue.applyDimension( unit, size, r.getDisplayMetrics()) 这个方法。

/**
 * Converts an unpacked complex data value holding a dimension to its final floating 
 * point value. The two parameters unit and value
 * are as in {@link #TYPE_DIMENSION}.
 *  
 * @param unit The unit to convert from.
 * @param value The value to apply the unit to.
 * @param metrics Current display metrics to use in the conversion -- 
 *                supplies display density and scaling information.
 * 
 * @return The complex floating point value multiplied by the appropriate 
 * metrics depending on its unit. 
 */
public static float applyDimension(int unit, float value,
                                   DisplayMetrics metrics)
{
    switch (unit) {
    case COMPLEX_UNIT_PX:
        return value;
    case COMPLEX_UNIT_DIP:
        return value * metrics.density;
    case COMPLEX_UNIT_SP:
        return value * metrics.scaledDensity;
    case COMPLEX_UNIT_PT:
        return value * metrics.xdpi * (1.0f/72);
    case COMPLEX_UNIT_IN:
        return value * metrics.xdpi;
    case COMPLEX_UNIT_MM:
        return value * metrics.xdpi * (1.0f/25.4f);
    }
    return 0;
}

我们发现 TypedValue.COMPLEX_UNIT_SP 该属性return value * metrics.scaledDensity; 不是原值 会 *  metrics.scaledDensity,所以在OTT 开发中如果想要一样的大小需要手动设置成 COMPLEX_UNIT_PX 该属性,手机等其他开发看情况设置。

7.TV开发 recyclerView 中上下滑动列表会发现数据丢失 

 前阵子遇到一个问题,一个个人中心的列表,列表使用的是recyclerView,数据是图片 + 文字结构,发现数据很多的时候 上下滑动列表文字有时候会丢失。出现这样的问题原因是recyclerView使用缓存机制的问题。解决方法是在对应的adapter的中添加回掉

@Override
public void onViewAttachedToWindow(BaseRecycleViewHolder holder) {
   holder.getView().setActivated(activated);
    super.onViewAttachedToWindow(holder);
}

实现上面这个回调,在view 显示的时候从新设置一下该holder的状态,已确保holder的状态准确添加。

 

 

东西不多,也很简单,BUT 还是要注意。

暂时就到这里,问题慢慢积累,总有一天我会拯救世界的。阿门~  为了世界和平!


 

你可能感兴趣的:(android)