写点什么

代码怎样 review?

发布于: 2021 年 11 月 07 日

比如 handler 必须在 onDestroy()中调用 removeCallbacksAndMessages(null)来清空 handler 里边的消息;


2>:对于成对出现的,要养成好的习惯,比如使用广播、EventBus 等都要记得注册、反注册;


3>:对于 Sqlite 数据库的操作,在使用完之后需要去关闭,cursor.close()及时去关闭、文件流使用完后要记得关闭、Bitmap 使用后要调用 recycler()方法回收;


4>:WebView 使用完后记得在 onDestroy 中调用 webview.destroy(),然后将其置为 null;



3.2 是否可以进一步优化自己的代码

1>:保存在内存中的图片,是否压缩过再保存在内存中;


可能由于图片太大、或图片质量太高,导致 OOM;


2>:intent 传递的数据过大,导致页面跳转太慢,太大的数据可以通过持久化的形式传递,比如读写文件;


3>:频繁的操作同一个文件或者同一个数据库的操作,要考虑把它用作静态变量或者局部变量的形式缓存在内存中,用空间换时间;


4>:放在主页面的控件,是否考虑用 ViewStub 来优化启动速度;



3.3 要小心第三方包

1>:build.gradle 远程依赖第三方包时,版本号尽量写死,不要写 + 号;


避免由于新版本的第三方包引入了新的问题


2>:导入第三方工程时记得把编码改为自己工程的编码;


3>:调用第三方包或者 JDK 方法时,跳进他们源码看下,是否需要添加 try{}cache(Exception e);


如果不加的话,可能会导致自己应用崩溃;


4>:系统应用添加 so 时,是否在固件对应的 Android.mk 文件上加入新增的 so,否则系统可能编译不过;


@lib/armeabi/libcommon.so @lib/armeabi/libabcdefg.so



3.4 注意成对出现的地方

1>:EventBus 注册、反注册;


2>:在生命周期的回调方法中,创建和销毁的代码是否成对出现;


比如:在 onCreate()中创建了 mAdapter,就必须在 onDestroy()中将 mAdapter 置为 null;


还有类似成对处出现的:


onStart()、onStop();


onResume()、onPause();


onCreateView()、onDestroyView();



3.5 仿内存泄露

1>:对于 handler 引起的异常:


public class MainActivity extends AppCompatActivity {


`private Handler handler ; private Runnable runnable ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);`


handler = <span class="hljs-keyword">new</span> TestHandler(<span class="hljs-keyword">new</span> WeakReference&lt;Context&gt;(<span class="hljs-keyword">this</span>)) ; runnable = <span class="hljs-keyword">new</span> TestRunnable() ; handler.postDelayed(runnable , <span class="hljs-number">10</span>*<span class="hljs-number">1000</span>) ;


}


private static class TestHandler extends Handler{


<span class="hljs-keyword">private</span> Context context ;


<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">TestHandler</span><span class="hljs-params">(WeakReference<Context> weakContext)</span></span>{


<span class="hljs-keyword">this</span>.context = weakContext.get() ;


}


}


private static class TestRunnable implements Runnable{


<span class="hljs-meta">@Override</span>


<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span> </span>{


}


}


@Override


protected vo


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


id onDestroy() {


super.onDestroy();


handler.removeCallbacks(runnable);


handler.removeCallbacksAndMessages(null);


}


}


一般使用弱引用,GC 扫过这块区域时会回收;


2>:考虑使用 Application Context 而不是 Activity Context


绝大部分必须使用 Activity 的 Context(Dialog),其余都都可以考虑使用 Application Context,这样可以在不经意间避免 Activity 的泄露;


3>:注意 Bitmap 对象的回收


在 bitmap 对象使用完后调用 recycler()方法回收


4>:对于一些成双成对出现的就养成好的习惯,注册反注册,可以有效的避免内存泄露;


5>:cursor 使用完后需要关闭;



3.6 其他情况

1>:只要是变量,不管是 string 类型、int 类型等,都需要进行非空判断;


2>:数据库修改后,需要把数据库版本号 +1;


3>:除数必须做非 0 判断;


4>:不要在 Activity 的 onCreate()方法中调用 PopWindow 的 showAsLocation()方法,因为 Activity 还没加载完,会报错;


4. 功能写完后,自测需要检查的地方


===================


4.1:凡是变量,在使用之前必须做非空判断,否则容易造成空指针问题;

评论

发布
暂无评论
代码怎样review?