1.使用Handler在子线程更新UI:有一部分刚入门的童鞋会认为handler的post(Runnable r)
方法是重开一条线程执行,其实只要你点进去源码,就会发现这个方法只是调用了sendMessageDelayed(Message msg, long delayMillis)
这个方法,所以调用 post
方法和你重写handleMessage(Message msg)
这个方法然后去调用sendMessage(Message msg)
这个方法其实是一样的,不过个人比较倾向于调用post
方法,因为感觉重写 handleMessage
方法会使代码阅读的时候跳来跳去了,比较不爽(当然,这只是个人喜好)。这个方法可以这样用
public void toast(String msg) { handler.post(() -> Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show()); }
在BaseActivity里面添加这个方法,这样在需要toast的时候直接调用就行了,不用管是否在主线程。
2.假如你使用RxJava,合理使用RxJavaErrorHandler
来处理全局错误,这样会减少很多重复代码的出现。具体使用方法
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() { @Override public void handleError(Throwable e) { }) };
3.当使用okhttp的时候,使用Interceptor来处理一些统一的请求处理,如每个请求的加密和请求的带一些公用的头信息等都应该Interceptor里面处理,如果需要获取okhttp post请求的时候的数据,可以用以下方法
private static String requestBody2String(okhttp3.Request request) { try { final okhttp3.Request copy = request.newBuilder().build(); final Buffer buffer = new Buffer(); RequestBody requestBody = copy.body(); if (requestBody != null) { requestBody.writeTo(buffer); } return buffer.readUtf8(); } catch (final IOException e) { return null; }}
这个方法将得到请求的数据的json字符串,我们可以将其转成json对象来获取请求的数据。
4.当Map的key使int、long、boolean的时候使用SparseArray、SparseIntArray、LongSparseArray、SparseBooleanArray来代替Map,因为在Map中,key不能是int、long、boolean这些类型,所以用的时候只能用Integer、Long、Boolean这些包装类做key,所以这个过程涉及到封箱和拆箱,数据一多的话,效率自然就明显会慢了。
5.使用Gson的时候最好使用@SerializedName("xxx")
这个来注解字段名,而不是让字段名和数据的key保持一致,因为有时候服务器返回的数据名可能格式风格和客户端的不一致,而且用注解的话,要是字段名称改变,直接改一下注解就行了,省去了很多麻烦。
6.还在为每次打包正式版的时候检查各种配置是否已经切换到正式线而烦恼么,利用好BuildConfig.DEBUG
可以解决你的烦恼,再也不用担心在打包后发现接口什么的还是测试线的。
7.使用@StringDef @IntDef
来代替枚举
8.如果你需要动态生成一张带有文字的图片,普通的做法是getDrawingCache
来获取view上面的bitmap,但是这样做生成的图片会受到手机分辨率的影响,而且还需要在界面上生成view才行,这样显然不可取,最理想的做法是用StaticLayout和Canvas来生成,StaticLayout这个会自动排版你的文字,TextView源码里就是用的这个。
9.Activity的recreate()
方法,重新创建activity,这个在切换当前activity主题或者中英文的时候很有用。
10.对于能用svg来替换的图片就尽量用svg,不仅体积小了很多,还可以随时手动改变大小而不失真。
11.如果你的应用经常OOM,相信我很多时候不是图片太大的问题,而是内存泄漏。这个时候可以用StrictMode
来检查是哪个地方出错了
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build());