【Android】个人项目总结

本人在研三时独自做了一个Android项目,该项目是一个外包项目,只花了一个多月做完,并不是天天做,因为研三临近毕业,有论文答辩等事情要忙,所以该项目还隐藏着许多漏洞,性能也没有完善等。

先说说该项目的框架吧

项目用到的知识

  • 网络方面
  • 使用网络框架OkHttp3(参考okHttp3总结
  • 使用RequestManager将请求封装,RequestManager使用单例模式,在RequestManager的构造函数中初始化OkHttpClient,这样,可以实现全局使用一个OkHttpClient对象,不用再去管cookie了。
  • 显示
  • 使用Glide框架加载图片
  • 自定义折线图控件、圆形头像控件
  • 百度地图
  • 数据
  • 使用Json解析请求到的数据
  • 使用SharedPreference来保存账号和密码信息

注意到的细节:

  • 内存泄漏问题
  1. 因为有使用到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;
             }
         }
}
  1. 单例造成内存泄漏问题

因为单例模式下,返回的是一个静态的对象,所以它与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的优化

发布了107 篇原创文章 · 获赞 142 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/u013293125/article/details/94174551