Corona中文站

强大、易学的跨平台(iOS/Android)开发框架。QQ群1:74390406(满) 群2:221929599

导航

Corona实现异步http通信的网络模块设计

 corona提供的network模块提供了简单的文件下载及访问http请求的功能,但是在处理并发方面经常会出现一些意料之外的bug.所以我自己封装了一个模块,对所有的通信请求放在一个队列里,然后设置一个timer进行集中处理。

======================================================================================================

代码如下(netHandle.lua):

======================================================================================================

 

module(..., package.seeall)

local network = require("network")

--隊列

local nList = {}

local stat = 0

local function request(params)

local cmd = params.cmd

local key = params.key

local paras = params.params

local listener = params.listener

local server = params.server or SURL

local p = {}

local data = ""

for i = 1, #paras do

if string.len(data) == 0 then

data = paras[i]

else

data = data .. "\n" .. paras[i]

end

end

p.body = "cmd=" .. cmd .. "&key=" .. key .. "&data=" .. data

print(p.body)

local function l( event )

listener(event)

stat = 0

end

stat = 1

network.request(server, "POST", l, p)

end

 

local function download( params )

local cmd = params.cmd

local key = params.key

local paras = params.params

local listener = params.listener

local filename = params.filename

local path = params.path

local server = params.server or SURL

local p = {}

local data = ""

for i = 1, #paras do

if string.len(data) == 0 then

data = paras[i]

else

data = data .. "\n" .. paras[i]

end

end

p.body = "cmd=" .. cmd .. "&key=" .. key .. "&data=" .. data

print(p.body, filename, path)

local function l(event)

listener(event)

stat = 0

end

stat = 1

network.download(server, "POST", l, p, filename, path)

end

 

function doWork()

if stat == 0 then

if #nList > 0 then

local params = nList[1]

if params.filename then

--download

download(params)

else

--req

request(params)

end

table.remove(nList, 1)

end

end

end

 

function addWork( params )

nList[#nList+1] = params

end

接口说明:

function addWork( params )--添加网络请求

function doWork() --处理网络请求,放置在timer里进行处理

======================================================================================================

处理代码(main.lua):

======================================================================================================
把以下代码加入到main.lua中,在程序启动时候执行。
timer.performWithDelay(300, function() netHandle.doWork() end, 0)
 

======================================================================================================

调用代码(*.lua):

======================================================================================================
 
下载文件示例:
--下載分流負載文件
function system_getsrvlist( l )
local function onCompleted( event )
local p = {}
p.result = false
if event.isError then
viewAlert.show(netErrorMsg)
else
p.result = true
end
l(p)
end
netHandle.addWork{
server = MURL,
cmd = 100,
key = "",
params = {},
listener = onCompleted,
filename = "srvlist.txt",
path = system.TemporaryDirectory
}
end
 
--异步请求示例代码:
local account_key = ""
 
function login(acc, pwd, srv, l)
local function onCompleted( event )
local p = {}
p.result = false
p.errMsg = ""
if event.isError then
viewAlert.show(netErrorMsg)
else
local str = event.response
--print(str)
local t = common.split(str, s1)
if tonumber(t[1]) == 1 then
p.result = true
account_key = t[2]
else
p.errMsg = t[2]
end
end
l(p)
end
 
netHandle.addWork{
cmd = "010101",
key = "",
params = {acc, pwd, srv},
listener = onCompleted
}
end

 

<< 专访《ChocoRun》作者:Choco团队的甜美灵感Corona569版本之后开始支持Android硬件按钮了 >>

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最近发表

Powered By Z-Blog 1.8 Walle Build 100427 Copyright 2011-2015 BuildApp.Net. All Rights Reserved.