热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android精妙面试题集三

1、绘制Activity和Fragment生命周期流程图,并以对比图形式展示。Activity生命周期图:Fragment生命周期图:两

1、绘制Activity和Fragment生命周期流程图,并以对比图形式展示。

Activity生命周期图:

https://img-blog.csdn.net/20130828141902812    

 

两者对比图:

https://img.php1.cn/3cd4a/1eebe/cd5/60405fda58cd0acd.webp

2、如何避免OOM异常

OOM(out of Memory)即内存溢出异常,也就是说内存占有量超过了VM所分配的最大,导致应用程序异常终止。

通常OOM都发生在需要用到大量内存的情况下,因为Android的每一个应用都是一个Davlik虚拟机,该虚拟机的默认堆内存只有16M,远远无法跟我们的PC机比较,因此和容易导致OOM(Out Of Memory)异常的产生。导致这样的异常主要有以下原因:①、加载大图片或数量过多的图片,因为图片是超级耗内存的,②、操作数据库的时候Cursor忘记关闭,③、资源未释放,比如io流,file等,④、内存泄露。我们用用的OOM主要是加载图片导致的。因为后面的三种原因都是可以通过约束程序员的编码规范来进行预防,或者使用性能分析工具来检查。所以大致分为两类:

     ⑴,加载对象过大;

     ⑵,相应资源过多,没有来不及释放。

解决方案:

            ①在内存引用上做些处理,常用的有软引用、强化引用、弱引用

            ②在内存中加载图片时直接在内存中做处理,如:边界压缩.

            ③动态回收内存

            ④优化Dalvik虚拟机的堆内存分配

            ⑤自定义堆内存大小

 

3、ANR是什么?怎么避免和解决ANR?

ANR:Application Not Responding,五秒

在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。

  当对输入事件(如按键、触摸屏事件)的响应超过5秒会出现ANR

  意向接受器(intentReceiver)超过10秒钟仍未执行完毕会出现ANR。

  任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等,潜在的比较耗时的操作,如访问网络和数据库,或者是开销很大的计算如改变位图的大小,需要在一个单独的子线程中完成(或者是使用异步请求,如数据库操作)。

 

4、请描述您在工作中所采用的Android异常处理机制(体现优点缺点)

如果在debug模式下开发的时候,是可以通过查看logcat日志来查看异常消息,从而进行处理。

如果我们在发布版本之后,用户在使用的时候会crash掉,我们需要写一个CrashHanler类结合log4j来记录日志,并且在发生crash时,将log文件发送到服务器。
这样程序就可以查看用户手机端的crash消息了,方便我们处理在debug模式开发时未发现的异常。

https://yq.aliyun.com/ziliao/26275

 

5、Handler,Loader和AsyncTask有什么区别,分别应用在哪些场景?

    Handler用于处理由looper分发的消息

   loader结合listview处理异步加载

     AsyncTask适合执行几秒内的网络任务

 

6、子线程发消息到主线程进行更新UI,有哪些方式?

方法一:用Activity对象的runOnUiThread方法更新 

在子线程中通过runOnUiThread()方法更新UI:

new Thread() {

        public void run() {

         //这儿是耗时操作,完成之后更新UI;

          runOnUiThread(new Runnable(){

                    @Override

                     public void run() {

                     //更新UI

                     imageView.setImageBitmap(bitmap);

}});}

}.start();

方法二:子线程调用Handler的sendMessage(message)发送事件。

①主线程中定义Handler:

Handler mHandler = new Handler() {

    @Override

      public void handleMessage(Message msg) {

             super.handleMessage(msg);

             switch (msg.what) {

                 case 0:

                 //完成主界面更新,拿到数据

                   String data = (String)msg.obj;

                    updateWeather();

                    textView.setText(data);

                     break;

                  default:

                     break;

}}};

②子线程发消息,通知Handler完成UI更新:

private void updateWeather() {

       new Thread(new Runnable(){

              @Override

              public void run() {

              //耗时操作,完成之后发送消息给Handler,完成UI更新;

                        mHandler.sendEmptyMessage(0);

                        //需要数据传递,用下面方法;

                        Message msg =new Message();

                        msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;

                        mHandler.sendMessage(msg);

}}).start();

}

方法三:View.post(Runnable )

public void onClick( View v ) {  
        new Thread( new Runnable() {  
                public void run() {  
                       // 耗时操作  
​    ​    ​    ​    ​    ​      loadNetWork();  
​                          myText.( new Runnable() {  
                                  myText.setText( 来自网络的信息);  
                          });  
                 }  
        }).start();  
}

方法四:AsyncTask

//UI线程中执行  
new DownloadImageTask().execute( "www.91dota.com" );  
private class DownloadImageTask extends AsyncTask {  
    protected String doInBackground( String... url ) {  
         return loadDataFormNetwork( url[0] );//后台耗时操作  
    }  

    protected void onPostExecute( String result ) {  
          myText.setText( result ); //得到来自网络的信息刷新页面   

   }  
}

总结:

a.如果只是单纯的想要更新UI而不涉及到多线程的话,使用View.post()就可以了;

b.需要另开线程处理数据以免阻塞UI线程,像是IO操作或者是循环,可以使用Activity.runOnUiThread();

c.如果需要传递状态值等信息,像是蓝牙编程中的socket连接,就需要利用状态值来提示连接状态以及做相应的处理,就需要使用Handler + Thread的方式;

d.如果是后台任务,像是下载任务等,就需要使用AsyncTask。

https://www.cnblogs.com/wenjiang/p/3180324.html

 

7、如何理解Activity、View、Window三者之间的关系?

Activity包含了一个PhoneWindow,而PhoneWindow就是继承于Window的,Activity通过setContentView将View设置到了PhoneWindow上。View的事件监听是由WindowManagerService来接受消息,并回调Activity函数,比如onClickListener,noKeyDown等。

https://blog.csdn.net/zane402075316/article/details/69822438

 

8、Activity的几种LaunchMode及使用场景

基本上我们可以直接指定一个launchMode属性在AndroidManifest.xml 文件中

android:screenOrientation="portrait"

android:launchMode="singleTop"/>

standard 模式介绍

默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。

场景:闹钟的使用 standard。用户可以启动此activity的多个实例,这些实例可以是任何任务的一部分,也可以是活动堆栈中的任何地方的一部分。

singleTop 模式介绍

如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。

场景:浏览书签页面使用singleTop(搜索功能)。虽然有可能是这一活动的多个实例,如果已经有一个在任务栈顶的活动将被重用和onnewintent()将被调用。这样,你只需要返回一次返回到浏览器,如果书签activity是开始多次。

singleTask 模式介绍

如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

场景:browseractivity使用singleTask。只有一个浏览器的活动的时间,它不成为一部分的任务,把它试图打开网页。虽然它可能会返回到任何最近推出的它,当你回击它实际上是固定在其自己的任务活动栈的底部。它将分享它的任务与活动,它推出像书签.

singleInstance 模式介绍

在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。

场景:

alarmalert使用singleInstance。只有一个警报活动在一个时间,它总是自己的任务。它启动的任何东西(如果有的话)成为它自己的新任务的一部分这种模式很少被使用。一些真正的用例是一个用于启动或应用程序的活动,你是100%肯定只有一个活动。总之,我建议你不要使用这种模式,除非它是真的有必要。

https://blog.csdn.net/android_freshman/article/details/52948124

 

9、android中的几种动画

①Tween(补间)动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;

②Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

 

10、RxJava有哪些优点?

异步、简洁(逻辑、代码读写)。内部支持多线程操作,强大的map和flatmap保证了依赖上一次接口数据进行二次处理时不会发生嵌套,将各个模块分离。

https://www.jianshu.com/p/06d506e6b728

11、你了解哪些设计模式,应用场景是什么?

http://mobile.51cto.com/android-535194.htm?mobile

12、 内存溢出和内存泄漏有什么区别?何时会内存泄漏?如何优化内存?

 

13、简述做过的项目,涉及到哪些技术点,遇到什么技术难点,解决方案

 

 

 


推荐阅读
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • Python | 字符串中案例数量的统计分析 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • OSChina 周末闲谈 —— 程序员的浪漫情话
    在OSChina的周末闲谈栏目中,探讨了程序员特有的浪漫情话。本文不仅分享了一些程序员如何用代码表达爱意的有趣例子,还推荐了一首适合程序员聆听的歌曲——李克勤的《啜泣》。对于喜欢在编程之余享受音乐的朋友们,不妨点击链接试听一下。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • Git核心命令全解析:掌握日常开发必备技能
    本文深入解析了 Git 的核心命令,帮助开发者掌握日常开发中的必备技能。从 `git init` 命令开始,介绍了如何将当前目录转变为 Git 可管理的仓库。接着详细讲解了 `git add` 命令的使用方法,包括如何将文件(如 `readme.txt`)添加到暂存区,以便在后续提交时进行版本控制。此外,还探讨了其他关键命令,如 `git commit` 和 `git push`,以确保代码变更能够安全地保存和同步到远程仓库。通过这些命令的综合应用,开发者可以更加高效地管理和协作项目。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 卓盟科技:动态资源加载技术的兼容性优化与升级 | Android 开发者案例分享
    随着游戏内容日益复杂,资源加载过程已不仅仅是简单的进度显示,而是连接玩家与开发者的桥梁。玩家对快速加载的需求越来越高,这意味着开发者需要不断优化和提升动态资源加载技术的兼容性和性能。卓盟科技通过一系列的技术创新,不仅提高了加载速度,还确保了不同设备和系统的兼容性,为用户提供更加流畅的游戏体验。 ... [详细]
author-avatar
zzzzzzzzssss
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有