本节深入解析Lua的所有流程控制结构,包含条件分支、循环结构、流程控制语句及其在Android开发中的最佳实践和性能考量。
Lua提供if-else条件分支结构,是UI逻辑和业务决策的核心。
local battery = 15
if battery < 20 then
print("电量不足")
showLowBatteryWarning()
end
local network = "wifi"
if network == "wifi" then
downloadLargeFile()
else
showMobileNetworkWarning()
end
Android网络状态判断示例:
local signal = getNetworkSignal()
if signal >= 4 then
setNetworkQuality("优")
elseif signal >= 2 then
setNetworkQuality("良")
elseif signal > 0 then
setNetworkQuality("差")
else
setNetworkQuality("无信号")
end
Lua提供三种循环结构,处理Android中的重复任务和异步事件。
-- 读取socket数据
local dataChunks = {}
local chunk = readNextChunk()
while chunk ~= nil do
table.insert(dataChunks, chunk)
chunk = readNextChunk()
end
-- 至少执行一次的循环
local attempt = 0
local success = false
repeat
attempt = attempt + 1
success = connectToServer()
until success or attempt >= 3
-- 初始化列表项
for i = 1, 10 do
listItems[i] = createListItem(i)
end
-- 带步长的倒序循环
for i = 10, 1, -1 do
print("倒计时:", i)
end
-- 遍历数组
local colors = {"red", "green", "blue"}
for index, value in ipairs(colors) do
print(index, value)
end
-- 遍历表键值对
local config = {width=1080, height=1920}
for key, val in pairs(config) do
print(key, val)
end
精细控制循环和代码块执行流程,在Android事件处理中尤为重要。
-- 搜索列表项
for i, item in ipairs(itemList) do
if item.id == targetId then
foundItem = item
break -- 找到后立即退出循环
end
end
local function findUser(users, name)
for _, user in ipairs(users) do
if user.name == name then
return user -- 提前返回
end
end
return nil -- 未找到
end
-- 错误处理集中化管理
local function processFile(filename)
local file = io.open(filename)
if not file then goto error end
-- 处理逻辑...
file:close()
return true
::error::
print("文件处理失败:", filename)
return false
end
复杂业务逻辑中的控制结构组合应用。
-- 二维数组初始化
local matrix = {}
for i = 1, 3 do
matrix[i] = {}
for j = 1, 3 do
matrix[i][j] = i * j
end
end
-- 用户输入验证
local validInputs = 0
for i = 1, 5 do
local input = getInput()
if input == nil then
print("输入不能为空")
elseif #input < 3 then
print("输入太短")
else
validInputs = validInputs + 1
end
end
移动端特殊场景下的控制结构优化技巧。
-- 分批处理避免ANR
local function processLargeData(data)
local chunks = splitData(data, 100) -- 每批100条
local function processChunk(i)
if i > #chunks then return end
-- 处理当前批次
for j = 1, #chunks[i] do
processItem(chunks[i][j])
end
-- 下一批次放入消息队列
android.postDelayed(function()
processChunk(i + 1)
end, 10) -- 10ms延迟
end
processChunk(1)
end
-- Androlua中的事件循环
local running = true
while running do
-- 处理事件
local event = {android.pollEvent()}
if event[1] == "key" then
handleKeyEvent(event)
elseif event[1] == "touch" then
handleTouchEvent(event)
elseif event[1] == "quit" then
running = false
end
end
-- 避免在循环中创建临时表
local temp = {} -- 预先分配
for i = 1, 10000 do
temp[1] = data[i].x
temp[2] = data[i].y
processPoint(temp) -- 复用表对象
end