[swx] Bug in LoadManager & solution
Ben Lagoutte
ben.lagoutte at gozer.com.au
Mon Jun 2 16:35:07 PDT 2008
Hi Aral, and everyone on the list,
I've been running into this issue with a recent project, and looking at
the mailing list archives some other people have had that problem too
(Bennie Jolink's post on the 29/12/07 for instance). I think I posted
the issue on the list a while back too but never got anywhere.
There's a problem with the way the swx request calls are handled on the
actionscript side.
The problem happens when multiple swx calls are made in a very close
period of time by different elements. The request seems to get stuck
indefinitely and so do all subsequent calls to swx.
A few people have suggested using cancelAllLoads() on the LoadManager as
a solution. Although it does do the job of clearing existing calls and
work in some cases it's really not a "solution". You can easily picture
cases where one component should not use cancelAllLoads because another
component is likely making an independent call of its own.
Other people also suggested doing swx calls one after another by calling
swx in sequence in result callback handlers, but that's assuming call
are tied together in some kind of logical sequence.
So I've spent a bit of time going through the swx AS API and I think
I've found where the problem is.
Within the LoadManager when calls are generated an id is generated for
the movieclip holder based on the queue length, then the item is added
to the queue and the queue start being processed. At that stage the
queue is right away emptied of its first element.
I think what's been happening is that one call would be made and a
holder would be created based on the id 0 (empty length = 0), then be
added to the queue (queue length = 1) and the queue would right away
start being processed, with its first element shifted right away (queue
becomes empty again, length = 0 by the time the call() method returns).
Then separately a second swx call would then happen before the first one
completes, and again a movieclip holder would be created based on the id
0 again (because the queue is already empty, even though one request is
still pending).
While the LoadManager wait for "holder0", an new "holder0" is created,
overwriting (I think, I'm not sure how flash handles references but it
seems to get lost) the previous one . Either way, the LoadManager then
waits infinitely for the first "holder0" to trigger an event that will
never occur.
I've made an updated version of the LoadManager that generates ids based
on an increment rather than the queue length and that seems bulletproof
now on that error with our project, hopefully that will help other
peoples too.
I've attached the updated version to this email, maybe that can be
integrated to the next version?
Additionally, I think (you tell me if there's a potential issue I
haven't thought about with that) in the loadNextExternalAsset function,
a slight optimisation would be to respond to the LOADED_BUT_NOT_READY
event rather than LOAD. I don't think the queue manager needs to wait
for the response movie to be fully ready to start processing the next
item in the queue.
Hope that's helpful.
Ben
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://osflash.org/pipermail/swx_osflash.org/attachments/20080603/de97c2fe/attachment.html
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: LoadManager.as
Url: http://osflash.org/pipermail/swx_osflash.org/attachments/20080603/de97c2fe/attachment.pl
More information about the swx
mailing list