代码怎样 review?
比如 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<Context>(<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
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:凡是变量,在使用之前必须做非空判断,否则容易造成空指针问题;
评论