过程是以名称保存的一组代码块或代码序列。创建过程后,不必反复拼接同一组代码块,只需在需要时调用它。在计算机科学中,过程也常称为函数或方法。
- 命名过程
- 匿名过程
- 执行过程
- 有返回值的过程
- 创建无返回值的匿名过程
- 创建有返回值的匿名过程
- 调用过程对象
- 使用输入列表调用过程对象
- 获取过程的输入项数量
- 按名称获取过程
- 从下拉列表获取过程
- 匿名过程常见搭配
命名过程
执行过程

将一组代码块组合成可重复调用的过程。如果过程需要参数,可使用代码块上的变形器按钮添加参数:单击蓝色加号,然后把更多参数拖入过程。
创建新过程块时,App Inventor 会自动选择唯一名称。单击名称即可修改。同一屏幕中的过程名称必须唯一,App Inventor 不允许定义两个同名过程。修改过程名称时,关联的调用块也会自动同步重命名。
过程名称不能使用 Java 关键字。这里列出了 Java 关键字。

创建过程后,App Inventor 会自动生成对应的调用块并放入“过程”抽屉。使用该调用块即可执行过程。
有返回值的过程

与执行过程块相同,但调用该过程时会返回一个结果。

创建这种过程后,会生成一个需要连接到值插槽的调用块。过程执行结果会从调用块返回,并传给与该调用块连接的其他代码块。
匿名过程
过程也是一种”值”。 数字可以存进变量、可以塞进别的块的插槽,过程同样可以——这就是”过程是一等公民”的含义。匿名过程就是不带名字的过程值:
- 命名过程:先起名字、放在抽屉里,哪里要用哪里调用。适合一处定义、多处使用。
- 匿名过程:不占名字,就地写一个过程,直接塞进插槽或存进变量。适合”当场用一次”或”当参数传给别人”。
匿名过程最重要的用法是回调(callback):把一个过程交给别的块,”这件事你先做,做完了调用我给你的过程”。控制抽屉里的 在后台运行、延时运行 用的就是这种插槽。
下面的例子把一个”打七五折”的匿名过程存进全局变量,再取出来调用——调用 折扣过程(200) 得到 150:
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="global_declaration" x="20" y="20"><field name="NAME">折扣过程</field><value name="VALUE"><block type="procedures_defanonreturn"><mutation><arg name="价格"></arg></mutation><field name="VAR0">价格</field><value name="RETURN"><block type="math_multiply"><value name="NUM0"><block type="lexical_variable_get"><field name="VAR">价格</field></block></value><value name="NUM1"><block type="math_number"><field name="NUM">0.75</field></block></value></block></value></block></value></block><block type="procedures_callanonreturn" x="20" y="220"><mutation items="1"></mutation><value name="PROCEDURE"><block type="lexical_variable_get"><field name="VAR">global 折扣过程</field></block></value><value name="ARG0"><block type="math_number"><field name="NUM">200</field></block></value></block></xml>
注意:左侧的”初始化全局变量”写的是变量名 折扣过程,右侧匿名过程里的 价格 是它自己的输入项(用蓝色齿轮添加),两者不是一回事。
创建无返回值的匿名过程

创建一个执行一组语句、但不返回结果的匿名过程。用蓝色齿轮可以添加输入项(参数)。
由于它没有名称,通常有两种去向:
创建有返回值的匿名过程

创建一个计算表达式并返回结果的匿名过程:左侧插头是”返回”值插槽,放什么就返回什么。同样可用蓝色齿轮添加输入项。
它适合即时定义一小段计算逻辑(例如上文的”打七五折”),作为参数传递或保存到变量中。
调用过程对象


动态执行一个过程对象:过程 插槽连接过程值(变量里存的匿名过程、按名称取回的过程都行),后面按顺序提供各个输入项。该块有两种形式:调用无返回值的过程用语句块,调用有返回值的过程用值块。
两个容易踩的坑:
- 输入项个数必须严格匹配:少了会报 “not enough arguments”,多了会报 “too many arguments”。不确定过程要几个参数时,先用获取过程的输入项数量查一下。
- 用值块调用无返回值的过程,得到的结果是
假——不是错误,但要意识到它没有意义。
使用输入列表调用过程对象


与调用过程对象作用相同,但把所有输入项打包成一个列表一次传入。当输入项的个数和内容要到运行时才能确定时,用这个块最方便——先构造好列表,再整体交给过程。
下面的例子用列表 (小明, 12) 调用存在变量里的 打招呼 过程,等价于按顺序传入”小明”和”12”两个输入项:
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="procedures_callanonnoreturn_inputlist" x="20" y="20"><value name="PROCEDURE"><block type="lexical_variable_get"><field name="VAR">global 打招呼</field></block></value><value name="INPUTLIST"><block type="lists_create_with"><mutation items="2"></mutation><value name="ADD0"><block type="text"><field name="TEXT">小明</field></block></value><value name="ADD1"><block type="math_number"><field name="NUM">12</field></block></value></block></value></block></xml>
循环里批量调用、从网络数据里拼参数再调用,都是它的主场。列表长度同样必须等于过程的输入项数量。
获取过程的输入项数量

接收一个过程对象,返回执行该过程所需的输入项数量。
主要用途是调用前的自检:配合使用输入列表调用过程对象时,先比较列表长度和输入项数量,不一致就提示用户,避免运行时报错。
按名称获取过程

根据文本名称获取对应的命名过程,返回过程对象。名称来自文本块、输入框或变量,因此可以在运行时动态决定调用哪个过程——这叫”动态调度”。
下面的例子按文本”打招呼”取出过程并调用:
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="procedures_callanonnoreturn" x="20" y="20"><value name="PROCEDURE"><block type="procedures_getWithName"><value name="PROCEDURENAME"><block type="text"><field name="TEXT">打招呼</field></block></value></block></value></block></xml>
两点务必注意:
- 只能找到命名过程——匿名过程没有名字,按名称是找不到的。
- 名称必须与过程定义完全一致(区分大小写、不含空格差异),拼错了会在运行时报错
Cannot read global procedure。名字来自用户输入时,最好先做校验。
从下拉列表获取过程

通过下拉列表选择项目中已经定义的命名过程,返回过程对象。
它是按名称获取过程的”安全版”:下拉列表只列出真实存在的过程,永远不会拼错名字。不需要运行时动态决定名字时,优先用这个。
匿名过程常见搭配
把上面这些块组合起来,几种最实用的模式:
| 模式 | 搭法 | 适用场景 |
|---|---|---|
| 后台计算 + 回调 | 在后台运行放匿名过程,回调里更新界面 | 大量运算不卡界面 |
| 延时执行 | 延时运行 + 匿名过程 | 倒计时、延迟翻页 |
| 过程存变量 | 初始化全局变量放匿名过程,调用过程对象取用 | 同一段逻辑按配置切换 |
| 动态传参 | 使用输入列表调用 + 列表块 | 参数个数运行时才确定 |
| 按名称调度 | 按名称获取过程 + 文本 | 用户选择要执行的操作 |
想一步步练熟这些搭配,跟着匿名过程入门:倒计时与回调案例走一遍。
扫码添加客服咨询