深入分析 Android Activity (五)

深入分析 Android Activity (五)

1. Activity 的进程和线程模型

在 Android 中,Activity 默认在主线程(也称为 UI 线程)中运行。理解进程和线程模型对于开发响应迅速且无阻塞的应用程序至关重要。

1.1 主线程与 UI 操作

所有 UI 操作必须在主线程中执行,以避免并发问题和 UI 不一致性。长时间的操作应在工作线程中完成,并使用主线程处理结果。

// Performing a long-running operation on a background thread
new Thread(new Runnable() {@Overridepublic void run() {// Long-running operationfinal String result = performOperation();// Post result back to the main threadrunOnUiThread(new Runnable() {@Overridepublic void run() {// Update UI with the resulttextView.setText(result);}});}
}).start();
1.2 使用 AsyncTask

AsyncTask 是一种方便的方式,可以在后台线程中执行操作,并在主线程中处理结果。不过,由于其容易导致内存泄漏和其他问题,现在更推荐使用 ExecutorServiceRxJava

private class MyAsyncTask extends AsyncTask<Void, Void, String> {@Overrideprotected String doInBackground(Void... voids) {return performOperation();}@Overrideprotected void onPostExecute(String result) {textView.setText(result);}
}// Execute the AsyncTask
new MyAsyncTask().execute();
1.3 使用 Handler 和 Looper

HandlerLooper 提供了一种灵活的方法来管理线程间通信。

// Creating a Handler on the main thread
Handler handler = new Handler(Looper.getMainLooper());// Running code on the main thread
handler.post(new Runnable() {@Overridepublic void run() {// Update UItextView.setText("Updated from background thread");}
});

2. Activity 的内存优化

内存管理是 Android 开发中的一个重要方面,特别是在设备资源有限的情况下。以下是一些常见的内存优化技巧。

2.1 避免内存泄漏

使用弱引用和上下文的短生命周期对象可以避免内存泄漏。避免在 ActivityFragment 中直接引用长生命周期对象,如单例模式。

// Use WeakReference to avoid memory leaks
private static class MyHandler extends Handler {private final WeakReference<MyActivity> mActivity;MyHandler(MyActivity activity) {mActivity = new WeakReference<>(activity);}@Overridepublic void handleMessage(Message msg) {MyActivity activity = mActivity.get();if (activity != null) {// Handle message}}
}
2.2 使用内存分析工具

Android Studio 提供了内存分析工具,可以帮助检测和解决内存泄漏。

// Use Android Profiler to detect memory leaks
2.3 优化 Bitmap 使用

Bitmaps 是常见的内存消耗大户。使用适当的压缩和回收策略来优化 Bitmap 使用。

// Decode bitmap with inSampleSize to reduce memory usage
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.large_image, options);// Recycle bitmap to free memory
bitmap.recycle();

3. Activity 的跨进程通信(IPC)

在 Android 中,跨进程通信通常使用 AIDL(Android Interface Definition Language)、Messenger 或 ContentProvider 来实现。

3.1 使用 AIDL

AIDL 提供了一种定义接口以便在不同进程之间通信的方法。

// IMyAidlInterface.aidl
interface IMyAidlInterface {void performAction();
}

实现 AIDL 接口:

public class MyService extends Service {private final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() {@Overridepublic void performAction() {// Perform action}};@Overridepublic IBinder onBind(Intent intent) {return mBinder;}
}

在客户端绑定服务:

private IMyAidlInterface mService;private ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName className, IBinder service) {mService = IMyAidlInterface.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName className) {mService = null;}
};// Bind to the service
Intent intent = new Intent(this, MyService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

4. 深入理解 Activity 的配置变化处理

配置变化(如屏幕旋转、语言更改等)会导致 Activity 被销毁并重新创建。开发者可以通过重写 onConfigurationChanged 方法来处理特定配置变化,避免 Activity 重新创建。

4.1 在 Manifest 文件中声明配置变化
<activity android:name=".MyActivity"android:configChanges="orientation|screenSize|keyboardHidden">
</activity>
4.2 重写 onConfigurationChanged 方法
@Override
public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);// Handle configuration changesif (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {// Handle landscape orientation} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {// Handle portrait orientation}
}

5. Activity 的调试和日志记录

5.1 使用 Logcat

Logcat 是 Android 提供的日志记录工具,开发者可以使用 Log 类来记录调试信息。

// Log debug information
Log.d("MyActivity", "Debug message");// Log error information
Log.e("MyActivity", "Error message", throwable);
5.2 使用调试工具

Android Studio 提供了强大的调试工具,包括断点调试、内存分析、性能分析等。

// Use breakpoints to debug the application

6. Activity 的单元测试和 UI 测试

测试是确保应用程序质量的关键环节,Android 提供了多种测试框架和工具来进行单元测试和 UI 测试。

6.1 使用 JUnit 进行单元测试

JUnit 是一个常用的 Java 单元测试框架,Android 提供了对 JUnit 的支持。

// Example unit test
public class MyActivityTest {@Testpublic void addition_isCorrect() {assertEquals(4, 2 + 2);}
}
6.2 使用 Espresso 进行 UI 测试

Espresso 是一个用于编写 UI 测试的框架。

// Example UI test
@RunWith(AndroidJUnit4.class)
public class MyActivityTest {@Rulepublic ActivityTestRule<MyActivity> activityRule =new ActivityTestRule<>(MyActivity.class);@Testpublic void ensureTextChangesWork() {onView(withId(R.id.editText)).perform(typeText("Hello"), closeSoftKeyboard());onView(withId(R.id.changeTextButton)).perform(click());onView(withId(R.id.textView)).check(matches(withText("Hello")));}
}

总结

深入理解和掌握 Activity 的各个方面,包括其生命周期、内存管理、进程和线程模型、配置变化处理、调试和测试,对于开发高效、稳定和用户友好的 Android 应用程序至关重要。通过不断学习和实践,可以提升应用程序的性能和用户体验,满足不断变化的用户需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干货 | 什么是单相感应电机控制器?一文带你看感应交流电机解决方案KP86202

单相感应电机控制器是一种用于控制单相感应电机运行的电子设备。单相感应电机是一种常见的电动机类型&#xff0c;广泛应用于家用电器、商业设备以及轻工制造等领域。 单相感应电机控制器通常包括电源模块、控制逻辑模块和功率输出模块。其主要功能是对单相感应电机进行启停、…

如何生成Github Badge徽章图标

如何生成徽章Badge 什么是徽章(Badge)生成小徽章shields网站开源项目的徽章lib版本徽章代码测试覆盖度开源协议Github workflow的徽章 开源代码实践效果py-enumjs-enumerate 什么是徽章(Badge) 在开源项目的README中&#xff0c;经常会见到一些徽章(Badge)小图标&#xff0c;如…

FastCopy

目录 背景: 简介&#xff1a; 原理: 下载地址: 工具的使用: 背景: 简介&#xff1a; FastCopy是一款速度非常快的拷贝软件&#xff0c;软件版本为5.7.1 Fastcopy是日本的最快的文件拷贝工具&#xff0c;磁盘间相互拷贝文件是司空见惯的事情&#xff0c;通常情况…

redis--redis Cluster

简介 解决了redis单机写入的瓶颈问题&#xff0c;即单机的redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素无中心架构的redis cluster机制&#xff0c;在无中心的redis集群当中&#xff0c;其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连…

【MySQL精通之路】InnoDB-INFORMATION_SCHEMA库Metrics表

1.介绍 INNODB_METRICS表提供了有关INNODB性能和资源相关计数器的信息。 INNODB_METRICS表列如下所示。 有关列描述&#xff0c;请参阅“INFORMATION_SCHEMA库INNODB_METRICS表”。 【MySQL精通之路】INFORMATION_SCHEMA库-INNODB_METRICS表-CSDN博客 mysql> SELECT * FRO…

好书推荐|MATLAB科技绘图与数据分析

提升你的数据洞察力&#xff0c;用于精确绘图和分析的高级MATLAB技术 MATLAB科技绘图与数据分析——jd 本书内容 《MATLAB科技绘图与数据分析》结合作者多年的数据分析与科研绘图经验&#xff0c;详细讲解MATLAB在科技图表制作与数据分析中的使用方法与技巧。全书分为3部分&a…

C语言 数组——数组的定义和初始化

目录 为什么使用数组(Array)? 一维数组的定义 一维数组的初始化 一维数组元素的访问 一维数组元素的赋值 数组的逻辑存储结构 数组的物理存储结构 二维数组的定义和初始化 为什么使用数组(Array)? 一维数组的定义 一维 数组的定义 int a[10]; 定义一个有 10 个 int 型元素的…

云WAF在应对新型网络攻击中的作用是什么?

云WAF&#xff08;Web Application Firewall&#xff09;在应对新型网络攻击中扮演着至关重要的角色。以下是云WAF的主要作用&#xff1a; 实时防御与智能分析 云WAF能够实时监测并分析网络流量&#xff0c;一旦发现潜在攻击行为立即进行阻断&#xff0c;有效防止各类Web应用层…

构建传统企业信息化数字化智能化技术架构:挑战与机遇

随着数字化和智能化技术的快速发展&#xff0c;传统企业在信息化转型过程中面临着前所未有的机遇和挑战。如何构建适应企业需求的信息化数字化智能化技术架构&#xff0c;成为企业发展的关键之一。本文将探讨传统企业信息化数字化智能化技术架构的设计与实践。 一、数字化转型的…

【缺失的第一个正数】leetcode,python

真是越做越觉得自己所学尚浅&#xff0c;&#xff0c; 啊&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 直接上石山代码&#xff1a;&#xff08;过不了一点&#xff09;。。。。。 class Solution:def firstMissingPositive(self…

SpringBoot发送邮箱

一、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency> 二、添加配置 application.yml文件 将username修改为自己的邮箱&#xff0c;password修改为…

SQL——DDL之数据表的操作

基础 # 每一列都要指定对应的类型 # 字符串&#xff1a;varchar(N) # 整数&#xff1a;int # 小数&#xff1a;double # 年月日&#xff1a;date # 年月日时分秒&#xff1a;datetime# 创建表 create table if not exists db_bigdata.student(stuid varchar(10),stuname varch…

[集群聊天服务器]----(四)MySQL数据库模块

上一节我们对网络模块和业务模块进行了解耦[集群聊天服务器]----(三)ChatService模块&#xff0c;解耦网络模块和业务模块&#xff0c;封装了回调函数。在项目中需要使用mysql数据库进行存储用户重要数据&#xff0c;并进行增删改查操作。&#xff0c;所以这一节我们对mysql的封…

Linux基础入门和帮助-第二篇

马哥教育 Linux SRE 学习笔记 用户登录信息查看命令 whoami: 显示当前登录有效用户 [rootrocky8 ~]$whoami rootwho: 系统当前所有的登录会话 [rootrocky8 ~]$who root pts/0 2024-05-24 12:55 (10.0.0.1)w: 系统当前所有的登录会话及所做的操作 [rootrocky8 ~]…

python对矩阵列进行操作

在Python中&#xff0c;可以使用NumPy库来对矩阵&#xff08;或称为矩阵、数组&#xff09;的列进行各种操作。以下是一些常见的列操作及其示例代码&#xff1a; import pandas as pd# 读取CSV文件 df pd.read_csv(output_file.csv, delimiter )# 对列进行求和 sum_columns …

WordPress 发布了独立的 SQLite 插件

之前 WordPress 在官方的 Performance Lab 插件实现 SQLite 模块&#xff0c;现在重构 SQLite 的实现&#xff0c;并且将其发布成一个独立的插件&#xff1a;SQLite Database Integration。 独立 SQLite 插件 最初的功能模块实现是基于 aaemnnosttv 的 wp-sqlite-db 插件修改实…

用ssh做跳板用周转服务器帮我们加速下载

假设有一台机器A&#xff0c;它从网站B下载东西很慢&#xff0c;但是有一台机器C&#xff0c;它从B下载比较快&#xff0c;它和A之间的速度也比较快&#xff0c;那么就可以在A发指令&#xff0c;通过ssh做跳板从C加速下载网站B的文件。 以下为示例命令&#xff1a; ssh 用户名…

【DevOps】Linux 下安装配置 Apache 服务器:打造你的专属 Web 平台

目录 一、准备工作 二、安装 Apache 三、启动和管理 Apache 四、验证安装 五、配置 Apache 5.1 修改网站根目录 5.2 配置虚拟主机 5.2.1 创建虚拟主机配置文件 5.2.2 创建网站目录 5.2.3 启用虚拟主机 5.2.4 重启 Apache 5.3 配置 HTTPS 5.3.1 安装 SSL 证书 5.3…

使用CyberRT写第一个代码, test ok

简介 计算框架是自动驾驶系统中的重中之重,也是整个系统得以高效稳定运行的基础。为了实时地完成感知、决策和执行,系统需要一系列的模块相互紧密配合,高效地执行任务流。由于各种原因,这些模块可能位于不同进程,也可能位于不同机器。这就要求计算框架中具有灵活的、高性…

谷歌蜘蛛池是什么?

或称为谷歌爬虫池&#xff0c;是一项专门针对谷歌搜索引擎优化&#xff08;SEO&#xff09;的先进技术&#xff0c;这种技术的主要目的是通过建立庞大的网站群体和复杂的链接结构来吸引和维持谷歌的爬虫程序的注意力&#xff0c;其核心是通过这种结构优化&#xff0c;增强特定网…