Android优化随笔2:过期的api

从过分析工具分析了一遍后,列出了项目中所有过期的api。

1
首先,就是好多过期的getResources().getColor(R.color.color_name),可以替换的为

getColor(R.color.color_name);//需要判断版本
getResources().getColor(R.color.color_name, getTheme());//跟上面的一个意思
ContextCompat.getColor(this, R.color.color_name);

貌似Google推荐使用ContextCompat.getColor(this, R.color.color_name),但其实里面就是帮我们做了版本判断

@ColorInt
public static int getColor(@NonNull Context context, @ColorRes int id) {
        if (Build.VERSION.SDK_INT >= 23) {
            return context.getColor(id);
        } else {
            return context.getResources().getColor(id);
        }
}

而且这个方法说,返回的color的就是当前主题的color,所以应该就是已经覆盖了前两种方式,所以才推荐的吧。

不过这没什么特别的,麻烦的是我的项目里有很多过期的getResources().getColor(R.color.color_name),而且每个地方上下文环境还不同,替换起来很麻烦。

最后我发现一个效率稍微高一些的方式,在全局查找的窗口里直接进行编辑和替换,可以减少很多操作步骤。


全局查找、操作.png

2
同理getResources().getDrawable(R.drawable.drawable_name)替换为

ContextCompat.getDrawable(this, R.drawable.drawable_name);

3
Webview中的shouldOverrideUrlLoading(WebView view, String url)替换为

shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

4
项目中有些自定义控件使用了setDrawingCacheEnabled这条语法,通过cache机制把绘制的view转换成bitmap使用,由于性能原因这条也被废弃了。查了一下可以用PixelCopy或者绘制Canvas两种方式进行替换。
PixcelCopy方式

  PixelCopy.request(getWindow(),
            new Rect(0, 0, view.getWidth(), view.getHeight()),b, copyResult -> {
                if (copyResult == PixelCopy.SUCCESS) {
                    //do sth
                }
            }, new Handler(Looper.getMainLooper()));

Canvas方式

Bitmap bitmap = Bitmap.createBitmap(mView.getMeasuredWidth(), mView.getMeasuredHeight(), Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
mIndicateView.draw(canvas);

5
setTextAppearance(Context context, @StyleRes int resId)替换为

setTextAppearance(@StyleRes int resId)//需要判断版本最低为23

6
RecyclerView的Adapter获取当前条目位置getAdapterPosition()替换为

getAbsoluteAdapterPosition()

7
获取屏幕宽度的方式
int w = context.getWindowManager().getDefaultDisplay().getWidth();
替换为

Point size = new Point();
context.getWindowManager().getDefaultDisplay().getSize(size);
int w = size.x;

8
setBackgroundDrawable(Drawable background)
替换为

setBackground(Drawable)

9
setSelectedTabIndicatorHeight
可以修改为

setSelectedTabIndicator(Drawable)

如果觉得设置drawable比较麻烦,可以在布局中直接

app:tabIndicatorHeight="*dp"

可以避免在代码中设置出现警告

10
自定义控件中的FILL_PARENT替换为MATCH_PARENT

11
获取当前版本号的方法,需要判断一下版本

pi = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    long longVersionCode = pi.getLongVersionCode();
    Log.d(TAG, "longVersionCode:" + longVersionCode);
    return (int) longVersionCode;
} else {
    return pi.versionCode;
}

12
彩蛋:还有一个提示api过期的地方,就是判断网络状态的方法, 原来是通过注册广播获取网络连接信息,现在可以通过ConnectivityManager以接口回调的方式获取,这两天正在研究相关语法,打算把判断网络状态的工具类更新一下。

你可能感兴趣的:(Android优化随笔2:过期的api)