Android基础知识总结(五)

41.线程安全的单例

        private static SingleInstance instance;

        public static SingleInstance getInstance(SingleInstance instance){
            if (instance == null) {
                synchronized (SingleInstance.class) {
                    if (instance == null) {
                        instance = new SingleInstance();
                    }
                }
            }
            return instance;
        }

    }

42.Serializable 序列化接口,开销大,建议使用,java方法;
Parcelelable 使用麻烦,效率高,多用于内存,Android方法。

43.Service启动方式和生命周期


image.png

①startService():开启,调用者退出后Service仍在;
生命周期:onCreate()--onStartCommand()--onDestory()
通过startService启动后,service会一直无限期运行下去,只有外部调用了stopService()或stopSelf()方法时,该Service才会停止运行并销毁。
②bindService():开启,调用者退出后Service随即退出。
生命周期:onCreate()--onBind()--onUnBind()--onDestory()
①+② 的生命周期:onCreate()--onStartCommand()--onBind()--onUnBind()--onDestory()

44.Android 常见布局
FrameLayout (框架布局)、LinearLayout(线性布局)、AbsoluteLayout(绝对布局)、RelativeLayout(相对布局)、TableLayout(表格布局)

45.Http是服务层,借助HttpClient和HttpUrlConnection建立短连接,请求一次后断开,需要重连时才连。
①HttpClient:开源框架,无封装,原始,使用方便,开发快,实现比较稳定,Android废弃,Android 6.0删除;
②HttpUrlConnection:对网络请求没有HttpClient封装彻底,Android2.2之前存在bug,所以2.2之前用HttpClient,之后用容易优化的HttpUrlConnection,开源框架,封装了请求头、参数、内容体、响应在I/O流,接口中统一封成了HttpGet/HttpPost,减少了操作的繁琐性,访问速度快。

Https是以安全为目标的Http通道,简单讲就是Http的安全版,即Http下加入SSL层,安全基础是SSL,加密的详细内容是SSL,作用:建立一个信息安全通道,来保证数据传输的安全、确认网站的安全性。

Volley:适合处理数据量小,通信频繁的网络操作,内部封装了异步操作,可直接在线程执行并处理结果,同时可以取消,容易扩展,但是不适合大数据请求,比如下载表现糟糕,不支持https,android2.2及以下用HttpClient,android2.3及以上用HttpUrlConnection。

OkHttp:专注于提升网络连接效率的Http客户端,能够实现IP和端口的请求重用一个socket,大大降低了连接时间,也降低了服务器的压力,对Http和https都有良好的支持,不用担心app版本更换的困扰,但是okHttp请求是在线程里执行,不能直接刷新UI,需要手动处理。

总结:在项目实际运用中,视情况选择网络请求方式,也可以Volley+OkHttp搭配使用。异步回调用Volley,网络请求底层用OkHttp

RxJava + Retrofit3 + OkHttp3
①RxJava 主要用来实现线程切换,我们制定订阅在哪一个线程,观察在哪个线程,通过操作符进行数据变换,整个过程是键式的,简化逻辑。
②Retrofit 是网络请求的一个架子,用它设置一些参数和请求Url。
③OkHttp是网络请求的内核,实际的网络请求是它发出来的。

TCP 是网络层,滑动窗口协议,拥塞控制,可靠连接借助socket长连接,需要3次握手,第四次取消连接,画面优先。
UDP:不关心数据是否到达,是否阻塞,不可靠连接,流畅优先。

46.如何节省内存使用,主动回收内存?
答:尽量多使用内部类,提高程序效率,回收已使用的资源,合理使用缓存,合理设置变量的作用范围。

47.Activity如何生成View?
答:Activity执行在attch()方法的时候,会创建一个PhoneWindow(Window的子类),在onCreate()方法的setContentView()方法中,创建DecorView,DecorView的addView()方法,把layout布局加载出来。通过onDraw()画出来,画View之前调用onMeasure()方法计算显示的大小。

48.为什么要使用多线程?
①更好地利用CPU资源;②进程间数据不能数据共享,线程可以;③系统创建进程需要为该进程重新分配系统资源,创建线程代价较小;④Java语言内置了多线程功能支持,简化了java多线程编程。

线程池是一种多线程处理形式,处理过程中将任务添加到队列,在创建线程后自动启动这些任务,线程池线程是后台线程,每个线程都使用默认的堆栈大小,以优先级执行。

49.现场保护

   @Override
   protected void onSaveInstanceState(Bundle savedInstanceState) {
       super.onSaveInstanceState(savedInstanceState);
   }

   @Override
   protected void onRestoreInstanceState(Bundle savedInstanceState) {
       super.onRestoreInstanceState(savedInstanceState);
   }

使用场景:①进程被异常杀死;②系统配置发生变化(比如横竖屏切花换)。
当Activity处于onPause() ,onStop() ,onDestroy() 三种状态时程序可能会被Android系统回收掉,这时可能会造成用户在程序当中的数据或者修改丢失。于是我们需要”现场保护”,当下次重启程序或activity时恢复上一次的数据。
因此Android提供了onSaveInstanceState(Bundlout State)方法会在程序被回收前进行调用,但需要注意的是onSaveInstanceState()方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等,而不应该用来保存持久化数据。onRestoreInstanceState方法,需要注意的是onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行。

50.内存溢出,内存泄漏
内存溢出(OOM):程序在申请内存时,没有足够的内存空间使用。
原因:加载对象过大,相对资源较多,来不及加载。
解决办法:内存引用上做处理,比如用软引用;图片加载时处理(压缩等);动态回收内存;优化内存分配,自定义堆内存大小,避免使用Enum,减少BitMap的内存占用,内存对象重复使用,避免对象的内存泄漏。
内存泄漏(memory leak): 程序在申请内存后,无法释放已申请的内存空间,一次泄漏危害可忽略,但推积严重最终会导致OOM;

handler泄露:消息引用了handler对象,该对象又隐性地持有了Activity对象,当发生GC时以为message-handler-activity的引用链导致Activity无法被回收,即发生泄漏,简单来说就是handler对activity强引用导致的GC,无法及时回收Activity。(PS:GC垃圾回收,当堆内存里的对象没有引用指向时,GC回收。)

解决办法:方法一:通过程序逻辑来进行保护。

1.在关闭Activity的时候停掉你的后台线程。线程停掉了,就相当于切断了Handler和外部连接的线,Activity自然会在合适的时候被回收。

2.如果你的Handler是被delay的Message持有了引用,那么使用相应的Handler的removeCallbacks()方法,把消息对象从消息队列移除就行了。

方法二:将Handler声明为静态类。

PS:在Java 中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用,静态的内部类不会持有外部类的引用。

静态类不持有外部类的对象,所以你的Activity可以随意被回收。由于Handler不再持有外部类对象的引用,导致程序不允许你在Handler中操作Activity中的对象了。所以你需要在Handler中增加一个对Activity的弱引用(WeakReference)。
WebView泄漏:创建的对象没有在合适的时间销毁,则一直存在内存里耗费内存空间,WebView不建议在xml文件中指明,因为一直存在不能对其销毁,应该在代码中创建WebView,通过addView()的方式加入layout,在Activity 的onDestory()方法中需要销毁,先将加载的内容置为null,webView.destroy();

WebView mWebView = new WebView(getApplicationContext());

   @Override
   protected void onDestroy() {
       if( mWebView!=null) {

           ViewParent parent = mWebView.getParent();
           if (parent != null) {
               ((ViewGroup) parent).removeView(mWebView);
           }

           mWebView.stopLoading();
           // 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错
           mWebView.getSettings().setJavaScriptEnabled(false);
           mWebView.clearHistory();
           mWebView.clearView();
           mWebView.removeAllViews();
           mWebView.destroy();

       }
       super.onDestroy();
   }

上一篇:Android基础知识总结(四):https://www.jianshu.com/p/4f46b2091349
下一篇:Android基础知识总结(六):https://www.jianshu.com/p/bf87c03a964e
https://www.jianshu.com/u/57ab9a74e2c0 每天进步一点点。。。(2019-05-10 )

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容