Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何用 Pandas 存取和交换数据?

如何用 Pandas 存取和交换数据?

作者头像
王树义
发布于 2019-06-04 09:03:29
发布于 2019-06-04 09:03:29
2.2K00
代码可运行
举报
文章被收录于专栏:玉树芝兰玉树芝兰
运行总次数:0
代码可运行

王树义

本文为你介绍 Pandas 存取数据的3种主要格式,以及使用中的注意事项。

问题

数据分析的过程里,你已经体会到 Python 生态系统的强大了吧?

数据采集、整理、可视化、统计分析……一直到深度学习,都有相应的 Python 包支持。

但是你会发现,没有任何一个 Python 软件包,是全能的。

这是一种非常好的设计思维——用优秀的工具,做专业的事儿;用许多优秀工具组成的系统,来有条不紊地处理复杂问题

所以,在这个过程中,你大概率会经常遇到数据的交换问题。

有时候,是把分析结果存起来,下次读取回来继续使用。

更重要的时候,是把一个工具的分析结果导出,导入到另一个工具包中。

这些数据存取的功能,几乎分布在每一个 Python 数据科学软件包之内。

但是,其中有一个最重要的枢纽,那就是 Pandas 。

我不止一次跟你提起过,学好 Pandas 的重要性

很多情况下,看似复杂的数据整理与可视化,Pandas 只需要一行语句就能搞定。

回顾我们的教程里,也曾使用过各种不同的格式读取数据到 Pandas 进行处理。

然而,当你需要自己独立面对软件包的格式要求时,也许仅仅是因为不了解如何正确生成或读取某种格式,结果导致出错,甚至会使你丧失探索的信心与兴趣。

这篇教程里,我以咱们介绍过多次的情感分类数据作为例子,用最小化的数据集,详细为你介绍若干种常见的存取数据格式。

有了这些知识与技能储备,你就可以应对大多数同类数据分析问题的场景了。

环境

为了方便你完整重现我教程中的代码,我使用 Google Colab 撰写和运行,并且存储副本到了 Github 里面。

请在我的公众号“玉树芝兰”(nkwangshuyi)后台输入“export”,就可以获得本教程相应的 Github 链接,以及代码运行环境的使用说明了。

数据

为了尽量简化问题,我们这里手动输入两条文本,构建一个超小型的评论情感数据集。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str1 = "这是个好电影,\n我喜欢!"
str2 = "这部剧的\t第八季\t糟透了!"

(猜猜看,其中 str2 里面的“这部剧”是哪一部?)

你看到了,这里我加了一些特殊符号进去。

其中:

  • \n :换行符。有时候原始评论是分段的,所以出现它很正常;
  • \t :制表符。对应键盘上的 Tab 键,一般在代码里用于缩进。用在评论句子中其实很奇怪。这里只是举个例子,下文你会看到它的特殊性。

我们打印一下两个字符串,看是否正确输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(str1)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
这是个好电影,
我喜欢!

换行符正确显示了。下面我们看看制表符。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(str2)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
这部剧的	第八季	糟透了!

好了,下面我们分别赋予两句话情感标记,然后用 Pandas 构建数据框。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd

我们建立了一个字典(dict),分别将文本和标记列表放到 textlabel 下面。然后,用 Pandas 的默认构建方式,自动将其转化为数据框(Dataframe)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.DataFrame({'text': [str1, str2], 'label': [1, 0]})
df

显示效果如下:

好了,数据已经正确存储到 Pandas 里面了。下面我们分别看看几种输出格式如何导出,以及它们的特点和常见问题。

CSV/TSV

我们来看最常见的两种格式,分别是:

  • csv :逗号分隔数据文本文件;
  • tsv :制表符分隔数据文本文件;

先尝试把 Pandas 数据框导出为 csv 文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.to_csv('data.csv', index=None)

注意这里我们使用了一个 index=None 参数。

回顾刚才的输出:

上图中标红色的地方,就是索引(index)。如果我们不加入 index=None 参数说明,那么这些数值型索引也会一起写到 csv 文件里面去。对我们来说,这没有必要,会白白占用存储空间。

将生成的 csv 文件拖入文本编辑器内,效果如下:

你可以清楚地看到,逗号分割了表头和数据。

有意思的是,因为第一句评论里包含了换行符,所以就真的记录到两行上面。而文本的两端,有引号包裹

第二句话,制表符(缩进)也是正确显示了。但是这句话两端,却没有引号

这么乱七八糟的结果,Pandas 还能够正确读回来吗?

我们试试看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pd.read_csv('data.csv')

一切正常。

看来,在读取 csv 的过程里,Pandas 还是很有适应能力的。

下面我们来看看颇为类似的 tsv 格式。

Pandas 并不提供一个单独的 to_tsv 选项。我们依然需要利用 to_csv 方法。

只不过,这次我们添加一个参数 sep='\t'

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.to_csv('data.tsv', index=None, sep='\t')

生成的文件名为 data.tsv 。我们还是在编辑器里面打开它看看。

对比一下刚刚的 csv 格式,你发现了什么?

大体上二者差不多。

只是逗号都变成了制表符缩进而已。

但是不知你是否发现,第二句话此时也被引号包裹起来了。

为什么呢?

对,因为这句话里面含有制表符。如果不包裹,读取的时候可就要出问题了。程序就会傻乎乎地把 “第八季” 当成标记,扔掉后面的内容了。

你看现在编辑器的着色,实际上已经错误判断分列了。

我们试着用 Pandas 把它读取回来。

注意,这里我们依然指定了,分割符是 sep='\t'

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pd.read_csv('data.tsv', sep='\t')

没有差别,效果依然很好。

这两种数据导出格式,非常直观简洁,用文本编辑器就可以打开查看。而且导出读取都很方便。

这是不是意味着,我们只要会用这两种格式就可以了呢?

别忙,我们再来看一个使用案例。

在处理中文文本信息时,我们经常需要做的一件事情,就是分词

这里,我们把之前两句话进行分词后,再尝试保存和读取。

为了分词,我们先安装一个jieba分词包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!pip install jieba

然后把它读取进来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jieba

前面我们给自己挖了个坑——为了说明特殊符号的存储,我们加了换行符和制表符。现在问题来了,分词之后,我们肯定不想要这些符号。

怎么办呢?

我们来编写一个定制化的分词函数就好了。

这个函数里,我们分别清除掉制表符和换行符,然后再用结巴分词切割。分词这里,我们用的是默认参数

因为分词后的结果实际上是个生成器(generator),而我们是需要真正的列表(list)的,所以利用 list 函数强制转换分词结果成为列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def cleancut(s):
  s = s.replace('\t', '')
  s = s.replace('\n', '')
  return list(jieba.cut(s))

我们生成一个新的数据框 df_list ,克隆原先的 df

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list = df.copy()

然后,我们把分词的结果,存到新的数据框 df_listtext 列上面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list.text = df.text.apply(cleancut)

看看分词后的效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list

怎么证明 text 上存储的确实是个列表呢?

我们来读取一下其中的第一个元素好了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list.text.iloc[0][0]

结果显示为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'这'

很好。此时的数据框可以正确存储预处理(分词)的结果。

下面我们还是仿照原先的方式,把这个处理结果数据导出,然后再导入。

先尝试 csv 格式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list.to_csv('data_list.csv', index=None)

导出过程一切正常。

我们来看看生成的 csv 文件。

在存储的过程中,列表内部,每个元素都用单引号包裹。整体列表的外部,被双引号包裹。

至于分割符嘛,依然是逗号

看着是不是很正常?

我们来尝试把它读取回来。当然我们希望读取回来的格式,跟当时导出的一模一样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pd.read_csv('data_list.csv')

结果是这样的:

初看起来,很好啊!

但是,我们把它和导出之前的数据框对比一下,你来玩儿一个“大家来找茬”游戏吧。

注意,导出之前,列表当中的每一个元素,都没有引号包裹的。

但是重新读取回来的内容,每一个元素多了个单引号。

这看起来,似乎也不是什么大毛病啊。

然而,我们需要验证一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pd.read_csv('data_list.csv').text.iloc[0][0]

这次程序给我们返回的第一行文本分割的第一个元素,是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'['

不应该是“这”吗?

我们来看看下一个元素是“这”吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pd.read_csv('data_list.csv').text.iloc[0][1]

答案是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"'"

看到这里,你可能已经恍然大悟。原来导出 csv 的时候,原先的分词列表被当成了字符串;导入进来的时候,干脆就是个字符串了。

可是我们需要的是个列表啊,这个字符串怎么用?

来看看 tsv 格式是不是对我们的问题有帮助。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list.to_csv('data_list.tsv', index=None, sep='\t')

打开导出的 tsv 文件。

列表就是列表,两边并没有用双引号包裹。

这次兴许能成!

我们赶紧读回来看看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pd.read_csv('data_list.tsv', sep='\t')

这结果,立刻让人心里凉了一半。

因为列表里面每个元素两旁的单引号都在啊。

抱着一丝侥幸的心理,我们尝试一下验证第一个元素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pd.read_csv('data_list.tsv', sep='\t').text.iloc[0][0]

果不其然,还是中括号

这意味着读回来的,还是一个字符串。

任务失败。

看来,依靠 csv/tsv 格式把列表导出导入,是不合适的。

那我们该怎么办呢?

pickle

好消息是,我们可以用 pickle 。

pickle 是一种二进制格式,在 Python 生态系统中,拥有广泛的支持。

例如 PyTorch 的预训练模型,就可以用它来存储和读取。

在 Pandas 里面使用 pickle,非常简单,和 csv 一样有专门的命令,而且连参数都可以不用修改添加。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list.to_pickle("data.pickle")

读取回来,也很方便。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list_loaded = pd.read_pickle("data.pickle")

我们来看看读取回来的数据是否正确:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list_loaded

这次看着好多了,那些让我们烦恼的引号都不见了。

验证一下第一行列表的第一个元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list_loaded.text.iloc[0][0]

结果是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'这'

很让人欣喜的结果啊!

看来 pickle 格式果然靠谱。

不过,当我们试图在文本编辑器里打开 pickle 格式的时候,会有警告。

如果我们忽略警告,一意孤行。那么确实还是可以打开的。

只不过,你看得懂吗?

反正我是看不懂的。

这就是二进制存储方式的问题——只适合机器来看,人读起来如同天书。

但这其实还不是 pickle 格式最大的问题。

最大的问题,在于不同软件包之间的交互。

我们在做数据分析的时候,难免会调用 Pandas 以外的软件包,继续分析我们用 Pandas 预处理后的文件。

这个时候,就要看对方支持的文件格式有哪些了。

一个最常见的例子,是 PyTorch 的文本工具包 torchtext 。

用它读取数据的时候,格式列表里面不包含 pickle 。

这可糟糕了。我们前面需要 Pandas 来预处理分词,后面又需要使用 Torchtext 来划分训练集和验证集,生成迭代(iteration)数据流,以便输入模型做训练。

可在二者中间,我们却被交换格式问题卡住了。

好在,天无绝人之路。

你看,这里列出的格式列表,除了 csv 和 tsv (已被我们验证过不适合处理分词列表)之外,还有一个 JSON

JSON

JSON 绝对是数据交换界的一等公民

它不仅可以存储结构化数据(也就是我们例子里面的数据框,或者你更常见的 Excel 表格),也可以存储非结构化数据。

如果你跟着我的教程了解过一些 API 的 Python 调用方法,那你对 JSON 格式应该并不陌生。

本例中我们使用的,是一种特殊的 JSON 格式,叫做 JSON Lines。

之所以用它,是因为前面我们介绍的 torchtext 包,要求使用这种格式。

所以,在 Pandas 的 to_json 函数里,我们还要专门加上两个参数:

  • orient="records" :每一行数据单独作为字典形式输出;
  • lines=True :去掉首尾的外部括号,并且每一行数据之间不加逗号。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list.to_json("data.json", orient="records", lines=True)

输出的结果,是这个样子的。

由于中文采用了 unicode 方式存储,所以此处我们无法直接识别每一个汉字。

但是,存储的格式,以及其他类型的数据记录,还是能看得一清二楚的。

我们来尝试读入。方法与输出类似,也是用同样的参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list_loaded_json = pd.read_json("data.json", orient="records", lines=True)

看看读入效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list_loaded_json

首先,你会发现列的位置发生了调换。好在对于数据框来说,这不是问题,因为列之间的相对位置本来也没有特殊含义。

其次,你能看到,那些引号都没有出现。

为了进一步验证,我们还是调取第一行列表的第一个元素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_list_loaded_json.text.iloc[0][0]

显示为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'这'

太棒了!

这样一来, Pandas 就可以和 torchtext 等软件包之间,建立顺畅而牢固的数据交换通道了。

小结

通过阅读本文,希望你已经掌握了以下知识点:

  • Pandas 数据框常用的数据导出格式;
  • csv/tsv 对于文本列表导出和读取中会遇到的问题;
  • pickle 格式的导出与导入,以及二进制文件难以直接阅读的问题;
  • JSON Lines 格式的输入输出方法及其应用场景;
  • 如何自定义函数,在分词的时候去掉特殊符号。

希望这些知识和技能,可以帮助你解决研究和工作中遇到的实际问题。

深度学习愉快!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 玉树芝兰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android 开发艺术探索笔记一
ViewRoot对应于ViewRootImpl类,它是连接windowmanager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成的,在ActivityThread中,当activity创建完毕后,会将DecorView添加到window中,同时创建viewrootImpl对象,并将viewrootImpl与DecorView关联。View的绘制流程从viewRoot的performTraversals方法开始,经过三个过程将view绘制出来
Yif
2019/12/26
1.1K0
Android进程间通信
IPC方法总是产生客户/服务端模式的调用,也即是客户端组件(Activity/Service)持有服务端Service的组件,只能是客户端主动调用服务端的方法,服务端无法反过来调用客户端的方法,因为IPC的另一端Service无法获取客户端的对象。
六月的雨
2020/03/27
1.4K0
23 个重难点突破,带你吃透 Service 知识点「长达 1W+ 字」
Service 会运行 onCreate ,然后是调用 onBind , 这个时候调用者和 Service 绑定在一起。调用者退出了,Srevice 就会调用 onUnbind -> onDestroyed 方法。
圆号本昊
2021/09/24
1.1K0
23 个重难点突破,带你吃透 Service 知识点「长达 1W+ 字」
《移动互联网技术》第八章 消息与服务:掌握不同类型广播监听方式,以及创建通知的方法
《移动互联网技术》课程是软件工程、电子信息等专业的专业课,主要介绍移动互联网系统及应用开发技术。课程内容主要包括移动互联网概述、无线网络技术、无线定位技术、Android应用开发和移动应用项目实践等五个部分。移动互联网概述主要介绍移动互联网的概况和发展,以及移动计算的特点。无线网络技术部分主要介绍移动通信网络(包括2G/3G/4G/5G技术)、无线传感器网络、Ad hoc网络、各种移动通信协议,以及移动IP技术。无线定位技术部分主要介绍无线定位的基本原理、定位方法、定位业务、数据采集等相关技术。Android应用开发部分主要介绍移动应用的开发环境、应用开发框架和各种功能组件以及常用的开发工具。移动应用项目实践部分主要介绍移动应用开发过程、移动应用客户端开发、以及应用开发实例。 课程的教学培养目标如下: 1.培养学生综合运用多门课程知识以解决工程领域问题的能力,能够理解各种移动通信方法,完成移动定位算法的设计。 2.培养学生移动应用编程能力,能够编写Andorid应用的主要功能模块,并掌握移动应用的开发流程。 3. 培养工程实践能力和创新能力。  通过本课程的学习应达到以下目的: 1.掌握移动互联网的基本概念和原理; 2.掌握移动应用系统的设计原则; 3.掌握Android应用软件的基本编程方法; 4.能正确使用常用的移动应用开发工具和测试工具。
猫头虎
2024/04/08
4270
android 加入AIDL进行底层通讯,Android接口定义语言aidl通信简单理解, 简单客户端和服务端demo,ipc,Serializable和Parcelable区别
​AIDL:Android Interface Definition Language,即Android接口定义语言。
zhangjiqun
2024/12/16
3730
Android入门教程 | 四大组件之Service(前台服务,后台服务)
Service是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。
Android_anzi
2021/10/20
6.6K0
【漫画技术】Android跨进程通信
Tips:4个环节,共计约9小时的精心打磨完成上线,同时也非常感谢参与审稿的同学。
用户2802329
2018/08/07
3230
【漫画技术】Android跨进程通信
Android中进程间通信(IPC)方式,知多少?
小编在车机项目测试中,有很多的定制需求,需要系统或者第三方应用和车机应用进行通信,故针对此部分学习下,希望不再做测试小白。
用户5521279
2019/06/02
6.5K0
你说一下 PendingIntent 和 Intent 的区别?
PendingIntent 的应用场景关键在于间接的 Intent 跳转需求, 即先通过一级 Intent 跳转到某个组件,在该组件完成任务后再间接地跳转到二级的 Intent。PendingIntent 中的单词 “pending” 指延迟或挂起,就是指它是延迟的或挂起的。例如,你在以下场景中就可以使用 PendingIntent:
用户9995743
2022/09/26
8160
你说一下 PendingIntent 和 Intent 的区别?
Android跨进程通信IPC之14——其他IPC方式
前面几篇文章,我们介绍了IPC的基础知识和Binder机制,本篇文章主要讲解各种跨进程的通信方式。
隔壁老李头
2018/08/30
1.8K0
Android跨进程通信IPC之14——其他IPC方式
很全面的Android面试题
这些有些来源于网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有,有可能有些问题讲的不对,能指正的希望大家不吝指教。 Activity 什么是Activity 四大组件之一,一个和用户交的互界面就是一个activity,是所有 View 的容器 Activity 生命周期 生命周期描述的是一个类 从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法. 在这个过程中会针对不同的生命阶段会调用不同的方法 Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回
六月的雨
2018/05/14
6.1K0
跨进程访问(AIDL服务)
我们都知道Service的主要的作用是后台运行和跨进程访问。 关于Service后台运行请查看鄙人的另外一篇文章Service基础
小小工匠
2021/08/16
9460
Android中的IPC方式
四大组件中的三大组件(Activity、Service、Receiver)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口,所以它可以方便地在不同的进程间传输。
见得乐
2022/07/20
1.5K0
Android中的IPC方式
Android四大组件完全解析(二)---Service
Service两大功能 : 当应用程序不与用户交互时,运行一些需要长时间运行的操作 为其他应用提供一些功能(提供能够跨进程调用的功能) Service的配置: service需要在所在应用的androidmanifest文件中进行配置: <!-- name是service的包名路径--> <!-- permission定义了开启该service时所需要的权限--> <service android:name="com.android.server.backup.KeyValueBackupJob"
fanfan
2018/01/24
1.4K0
Android跨进程通信IPC之11——AIDL
设计这门语言的目的是为了实现进程间通信,尤其是在涉及多进程并发情况的下的进程间通信IPC。每一个进程都有自己的Dalvik VM实例,都有自己的一块独立的内存,都在自己的内存上存储自己的数据,执行着自己的操作,都在自己的那个空间里操作。每个进程都是独立的,你不知我,我不知你。就像两座小岛之间的桥梁。通过这个桥梁,两个小岛可以进行交流,进行信息的交互。
隔壁老李头
2018/08/30
1.7K0
Android跨进程通信IPC之11——AIDL
图解 | Binder浅析(一)
Framework和Binder的内容挺深的,本文还是站在应用层开发者的角度来建立基本认知,能在遇到问题的时候有思路和方向即可。(本文将带着关键问题和核心流程展开,不会面面俱到)
Holiday
2020/11/06
1K0
有关Android插件化思考
最近几年移动开发业界兴起了「 插件化技术 」的旋风,各个大厂都推出了自己的插件化框架,各种开源框架都评价自身功能优越性,令人目不暇接。随着公司业务快速发展,项目增多,开发资源却有限,如何能在有限资源内满足需求和项目的增长,同时又能快速响应问题和迭代新需求,这就是一个矛盾点。此时,插件化技术正好风生水起,去了解各个主流框架实现思路,看看能对目前工作是否有帮助,是很有必要的。
用户1269200
2018/10/08
1.3K0
有关Android插件化思考
Android:远程服务Service(含AIDL & IPC讲解)
步骤2. 在新建AIDL文件里定义Service需要与Activity进行通信的内容(方法),并进行编译(Make Project)
Carson.Ho
2019/02/22
2.6K0
Android查缺补漏(IPC篇)-- Bundle、文件共享、ContentProvider、Messenger四种进程间通讯介绍
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8387752.html 在Android中进程间通信的实现方式有多种,包括:Bundle、文件共享、ContentProvider、Messenger、AIDL、Socket等等,其各有各的优缺点,接下来就分别介绍一下上述各种进程间的通信方式及实现。 一、Bundle Activity、Service、Receiver都支持Intent中传递Bundle数据,由于Bundle实现了Parc
codingblock
2018/03/30
1.3K0
现代 WorkManager API 已发布
随着设备性能提升和软件生态发展,越来越多的 Android 应用需要执行相对更复杂的网络、异步和离线等任务。例如用户想要离线观看某个视频,又不想一直停留在应用界面等待下载完成,那么就需要以一定的方式让这些离线的过程在后台运行。再比如您想将一段精彩的 Vlog 分享到社交媒体,肯定也会希望视频上传时不会影响到自己继续使用设备。这就涉及到了我们今天分享的主题: 使用 WorkManager 管理后台和前台工作。
Android 开发者
2022/03/28
1.5K0
现代 WorkManager API 已发布
推荐阅读
相关推荐
Android 开发艺术探索笔记一
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验