本人在研三时独自做了一个Android项目,该项目是一个外包项目,只花了一个多月做完,并不是天天做,因为研三临近毕业,有论文答辩等事情要忙,所以该项目还隐藏着许多漏洞,性能也没有完善等。
先说说该项目的框架吧
项目用到的知识
- 网络方面
- 使用网络框架OkHttp3(参考okHttp3总结)
- 使用RequestManager将请求封装,RequestManager使用单例模式,在RequestManager的构造函数中初始化OkHttpClient,这样,可以实现全局使用一个OkHttpClient对象,不用再去管cookie了。
- 显示
- 使用Glide框架加载图片
- 自定义折线图控件、圆形头像控件
- 百度地图
- 数据
- 使用Json解析请求到的数据
- 使用SharedPreference来保存账号和密码信息
注意到的细节:
- 内存泄漏问题
- 因为有使用到Handler,所以有考虑到内存泄漏情况,在写代码的时候就尽量避免handler造成内存泄漏
- 将Handler弄成静态的
- 使用弱引用
- 在onDestroy里面调用removeCallbacksAndMessage
private static class MyHandler extends Handler {
private final WeakReference<Context> reference;
public MyHandler(Context context) {
reference = new WeakReference<Context>(context);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
LoginActivity activity = (LoginActivity) reference.get();
switch (msg.what) {
case 1:
break;
case 2:
Bitmap bitmap = (Bitmap) msg.obj;
activity.passcode_img.setImageBitmap(bitmap);
break;
}
}
}
- 单例造成内存泄漏问题
因为单例模式下,返回的是一个静态的对象,所以它与Application拥有相同的生命,当传入一个Context时,如果传入的是Activity的对象时,那么这个activity在完成任务后就无法被回收,因为单例持有它的对象,所以传入的context应该是getApplicationContext()
/**
* 初始化RequestManager
*/
public RequestManager(Context context) {
//初始化OkHttpClient
mOkHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)//设置超时时间
.readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(10, TimeUnit.SECONDS)//设置写入超时时间
.build();
//初始化Handler
okHttpHandler = new Handler(context.getMainLooper());
}
...
/**
* 获取单例引用
*
* @return
*/
public static RequestManager getInstance(Context context) {
RequestManager inst = mInstance;
if (inst == null) {
synchronized (RequestManager.class) {
inst = mInstance;
if (inst == null) {
inst = new RequestManager(context);
mInstance = inst;
}
}
}
return inst;
}
使用单例时:
manager = RequestManager.getInstance(getApplicationContext());
这个项目中遇到的问题
-
在Fragment里面用到了百度地图,使用的是MapView,然后Fragment互相切换时,会出现重叠卡死现象。解决的方法是:使用TextureMapView。但使用TextureMapView会出现黑屏现象,这时,将Application里面设置的android:hardwareAccelerated="true"去掉就行了。
-
ListView的卡顿,通过ListView的优化