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的中添加回掉
实现上面这个回调,在view 显示的时候从新设置一下该holder的状态,已确保holder的状态准确添加。
东西不多,也很简单,BUT 还是要注意。
暂时就到这里,问题慢慢积累,总有一天我会拯救世界的。阿门~ 为了世界和平!