Android知识 :Android 的UI、dialog没有显示时isShowing方法还是为true、Android内存泄漏应用程序会崩溃吗?Android列表notifyDataSetChang


请添加图片描述

🍵🍵Android 的UI

Android 的UI 可以分为两类,一类叫做ViewGroup容器,一类叫做View视图

🍎🍎ViewGroup容器:内部可以承载、放置、添加View视图
🍎🍎View视图:(TextView,Button,ImageView)都是常用常见的视图.



🍵🍵dialog没有显示时isShowing方法还是为true

常见的Dialog,常用的isShowing方法,用此方法常判断dialog是否正在显示,但是有时发现dialog没有显示,此方法也是返回true,这就尴尬了。
在这里插入图片描述

产生原因:
🍓🍓1、点击返回按键或者点击dialog之外的屏幕->cancel()->dismiss()->dismissDialog->mShowing = false;
此时dialog没有显示, isShowing方法返回false;
🍓🍓2、调用hide()->dialog隐藏,mShowing依然是true;
此时dialog没有显示,isShowing方法返回true;

Activity isFinishing()判断Activity的状态实例




🍵🍵Android内存泄漏应用程序会崩溃吗?

答案:不一定。
🍓🍓内存泄漏(Memory Leak):是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
🍓🍓内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用,从而出现OOM;


什么操作会造成动态分配的最内存不会被释放,即不会被回收呢,平时常见的操作如下:
🥭🥭 1、单例造成的内存泄露:单例是长时间存活的,如果持有Activity的引用,那么就会导致Activity在销毁的时候不会被回收;
🥭🥭 2、非静态内部类创建静态实例造成的内存泄露:非静态内部类持有外部类的引用,如果创建静态实例,那么会一直持有外部类的引用,导致外部实例不会被回收;
🥭🥭3、Handler造成的内存泄露:原因如上,Handler持有外部类的引用,Message持有Handler的引用,MessageQueue持有Message的引用,Looper持有MessageQueue的引用,Looper一直存在,导致引用链都不会被回收;
🥭🥭 4、线程造成的内存泄露:在Activity内部启动匿名的Thread,在Thread内部执行耗时的操作,Thread不退出的话,就会导致Activity在销毁的时候不会被回收;
🥭🥭5、WebView造成的内存泄露:WebView不好管理,通常将其放在独立的进程中,即使内存溢出也不会导致应用崩溃;


总结:
1、内存泄漏不一定会引起崩溃,但是内存溢出一定会。
2、内存泄露会导致内存溢出。

Android 内存泄露及LeakCanary分析




🍵🍵Android列表notifyDataSetChanged用法

Android中,通常在列表中添加、删除或者是修改数据,notifyDataSetChanged()可以在适配器绑定的数组后,不用重新刷新Activity,通知Activity的适配器更新列表的数据即可。常用的列表指的是listview、recycleview。
必须要强调的就是notifyDataSetChanged必须是列表和适配器都初始化好了之后。
notifyDataSetChanged()会记住你划到的位置,重新加载数据的时候不会改变位置,只是改变了数据;而用notifyDataSetInvalidated()时,数据改变的同时,自动滑到顶部第0条的位置.

在这里插入图片描述



🍵🍵lambda表达式

lambda表达式【kotlin】~~~优雅的代码

view.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
	finish();
}
});

可以用Lambda表达式改写

view.setOnClickListener(v -> finish());

https://blog.youkuaiyun.com/weixin_42503069/article/details/117721647



🍵🍵Android隐藏标题栏的四种方法

Android隐藏标题栏的四种方法

Android App 隐藏标题栏+状态栏+导航栏



🍵🍵Android面试题

1. Android框架是一套用于开发Android应用程序的软件包。它包含以下组成部分:

  • 应用程序框架(Application Framework):提供开发Android应用程序所需的各种类和函数库,包括Activity、Fragment、Service、Content Provider等。
  • 系统组件(System Components):核心系统组件,如Activity Manager、Window Manager、Package Manager等,用于管理应用程序生命周期、窗口管理和应用程序安装等。
  • 硬件抽象层(Hardware Abstraction Layer,HAL):将Android框架与硬件驱动程序之间进行了抽象,使得不同的硬件可以很方便地与Android系统对接。
  • 运行时环境(Runtime Environment):运行Android应用程序的Dalvik虚拟机或ART(Android Runtime)。
  • 系统库(System Libraries):提供与应用程序开发相关的功能库,如图形库、媒体库、数据库库等。
  • Linux内核(Linux Kernel):作为Android系统的底层核心,提供了内存管理、进程管理、设备驱动等基本功能。

2. Activity生命周期包括以下方法:

  • onCreate():当Activity被创建时调用,进行初始化操作。
  • onStart():当Activity即将可见时调用,此时可以开始执行一些前台准备工作。
  • onResume():当Activity可见且获得用户焦点时调用,此时可以开始更新UI和处理用户交互。
  • onPause():当Activity失去用户焦点时调用,用于保存未提交的数据和停止与用户交互的操作。
  • onStop():当Activity完全不可见时调用,可进行资源释放和停止后台操作。
  • onDestroy():当Activity被销毁时调用,释放所有资源。

3. Fragment生命周期包括以下方法:

  • onAttach():当Fragment与Activity关联时调用。
  • onCreate():当Fragment被创建时调用,进行初始化操作。
  • onCreateView():创建Fragment的布局视图。
  • onActivityCreated():当Activity的onCreate()方法返回后调用,用于初始化与Activity相关的操作。
  • onStart():当Fragment即将可见时调用,此时可以开始执行一些前台准备工作。
  • onResume():当Fragment可见且获得用户焦点时调用,此时可以开始更新UI和处理用户交互。
  • onPause():当Fragment失去用户焦点时调用,用于保存未提交的数据和停止与用户交互的操作。
  • onStop():当Fragment完全不可见时调用,可进行资源释放和停止后台操作。
  • onDestroyView():当Fragment的布局视图被移除时调用。
  • onDestroy():当Fragment被销毁时调用,释放所有资源。
  • onDetach():当Fragment与Activity解除关联时调用。

4. Intent是Android系统中的一种跳转和通信机制。它用于在各个组件(如Activity、Service、Broadcast Receiver)之间传递数据和执行操作。Intent可以被用于以下目的:

  • 启动Activity:通过显式或隐式的方式启动Activity,传递数据给目标Activity。
  • 启动Service:启动后台服务并执行相应的操作。
  • 发送广播:向系统或其他应用程序发送广播消息。
  • 打开外部组件:打开其他应用程序内的Activity或Service。
  • 进行数据传递:通过Intent附带数据进行组件间的通信。
    5. 广播(Broadcast)机制用于在Android系统中实现组件之间的消息通信。优点:
  • 实现组件之间的松耦合通信,提高了组件的重用性和灵活性。
  • 可以跨应用程序进行消息传递。
  • 可以在不同组件间传递复杂的数据类型。
  • 支持有序广播,可以按照优先级依次接收和处理广播消息。
    缺点:
  • 广播是一种全局的机制,很容易导致滥用和性能问题。
  • 广播发送后无法获取反馈或结果,不适合进行同步通信。
  • 广播机制的安全性较低,可能受到非法广播的干扰。

6. 服务(Service)是Android中一种长时间运行在后台的组件,用于在不与用户界面交互的情况下执行某些任务。服务具有以下生命周期方法:

  • onCreate():当服务被创建时调用,进行初始化操作。
  • onStartCommand():当服务启动时调用,用于执行后台任务。
  • onBind():用于绑定服务的客户端组件,实现服务与其他组件(如Activity)的通信。
  • onUnbind():当服务的客户端组件与其解绑时调用。
  • onDestroy():当服务被销毁时调用,释放所有资源。

7. 四大组件是指Activity、Service、Broadcast Receiver、Content Provider。

  • Activity:用于创建用户界面和与用户进行交互。
  • Service:运行在后台执行一段长时间的操作,没有用户界面。
  • Broadcast Receiver:用于接收和响应广播消息。
  • Content Provider:用于共享和管理应用程序数据。

使用场景:

  • Activity:构建应用程序的用户界面、响应用户的操作。
  • Service:在后台执行一些长时间运行的任务,例如下载文件、播放音乐。
  • Broadcast Receiver:根据接收到的广播消息执行相应的操作,例如网络状态变化、电量低警告。
  • Content Provider:为应用程序提供数据库访问、数据共享的接口。

8. Android存储选项包括内部存储和外部存储。

  • 内部存储:每个应用程序都有自己的内部存储空间,用于存储私有数据(如数据库、文件等)。其他应用程序无法直接访问这些数据。请注意,当应用程序卸载时,内部存储中的数据也会被删除。
  • 外部存储:
    • 公共外部存储:用于存储可以被其他应用程序访问的公共文件,如音频、图片、文档等。这些文件存储在设备的共享外部存储目录中,例如SD卡。
      - 私有外部存储:每个应用程序都可以在设备的私有外部存储目录中创建自己的文件和文件夹。其他应用程序无法直接访问这些数据。请注意,当应用程序卸载时,私有外部存储中的数据不会被自动删除。

9. 主线程(UI线程)是Android应用程序的主要线程,用于处理与用户界面相关的操作。工作线程(后台线程)用于执行耗时操作,以不阻塞主线程并保持应用程序的响应性。以下是主线程和工作线程的使用场景:

  • 主线程(UI线程):
    • 更新UI元素和界面控件。
    • 与用户进行交互,处理用户的输入事件。
    • 执行轻量级的计算和数据处理操作。
  • 工作线程(后台线程):
    • 执行耗时的网络请求和数据库操作。
    • 执行复杂的计算和数据处理操作。
    • 执行文件读写操作。
    • 处理其他非UI相关的任务。

10. AsyncTask是Android中用于在后台执行异步任务的类。它封装了异步任务的处理逻辑,方便在UI线程中进行任务的启动和结果的处理。AsyncTask原理如下:

- AsyncTask是一个泛型类,通过继承它并实现其核心方法,即onPreExecute、doInBackground、onProgressUpdate和onPostExecute。
- 在UI线程中创建AsyncTask的实例,并调用execute方法启动任务。
- execute方法会创建一个工作线程来执行doInBackground方法。
- doInBackground方法在工作线程中执行耗时操作,可以通过publishProgress方法来更新任务的进度。
- onProgressUpdate方法在UI线程中执行,用于更新UI元素,例如进度条。
- doInBackground方法执行完毕后,会触发onPostExecute方法,在UI线程中进行结果的处理。

注意事项:

  • AsyncTask适用于执行一些简单且时间较短的异步任务,不适用于长时间运行的任务。
  • 避免同时启动大量的AsyncTask实例,以避免线程池过载。
  • 在Activity销毁时取消正在执行的AsyncTask,以避免出现内存泄漏和异常。
  • 在doInBackground方法中不要直接更新UI元素,应该使用publishProgress方法进行进度更新。
    请添加图片描述


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不良使

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值