Application Domains in Flex
Wednesday, March 4th, 2009In this post I will try to explain the best I can why you need to know about application domains and how to use them. An application domain is the partition within which an application runs in Flash Player. If you read the documentation you will see that application domain is a container for discrete groups of class definitions.
But what exactly an application domain does and when the understanding of application domain will helps you ? Usually there is just one application running which implies the existence of only one application domain. Hance you will not notice or care about the application domain. However, when you load additional .swf files into your application you can create additional application domains for all the .swf files you load.
So let’s start. I will try to explain the application domain with an example. Let’s say we have an application named MyApplication that has a class HelloW with one function sayHello() and we want to load two .swf files in this application that has a class with the same name HelloW with one function sayHello() . When we load a .swf file, three possible things can occur:
1. The loaded .swf runs in an existing application domain.
2. The loaded .swf runs in a new application domain that is a child of an existing application domain.
3. The loaded .swf runs in a new application domain that is completely partitioned from all other application domains.
So let’s see for our example what will happen in each of the three cases :
1. The loaded .swf runs in an existing application domain

Fig 1.0
You can load a swf in the existing application domain like this:
var context :LoaderContext = new LoaderContext( );
context.applicationDomain = ApplicationDomain.currentDomain;var request :URLRequest = new URLRequest(”SWF1.swf”);
var loader :Loader = new Loader( );loader.load(request, context);
In our example, if we load our two swf files in the existing application domain the HelloW class from the first swf and HelloW class form the second swf will be lost against the HelloW class from the main application. Another problem will be that the SWFHelloW class from the second swf will be lost against the SWFHelloW class from the first swf. So, in the end, we will have :
- the HelloW class from MyApplication
- the SWFHelloW class from SWF1
Using this application domain we share code and use less memory, but in first SWF1 we have lost the HelloW class this can cause some big errors. All objects from SWF1 that use HelloW will now use HelloW from MyApplication and this class has different functionalities so this will cause some pretty nice errors. In the second SWF2 we have lost the HelloW and the SWFHelloW class. Which can cause considerable errors. In the end we will have an app with a lot of errors.
In order for this application domain to work we must edit our example like this :
- the HelloW class from SWF1 and SWF1 must do the same things as HelloW class from MyApplication
- the SWFHelloW class from SWF2 must do the same things as SWFHelloW class from SWF1.
2. New application domain that is a child of an existing application domain
Neither of this application domains is good(suited) for our exemple. But let me show you what is the main difference between this application domain and the one before.

Fig 2.0
In this application domain we lose the HelloW class but we don’t lose the SWFHelloW class from the second SWF. We achieve this application domain like this :
var context :LoaderContext = new LoaderContext( );
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);var request :URLRequest = new URLRequest(”SWF1.swf”);
var loader :Loader = new Loader( );loader.load(request, context);
3. New application domain
This is the solution for our example. Using this application domain in the end we will have:
- the HelloW class from MyApplication
- the HelloW class from SWF1 and SWF2
- the SWFHelloW class from SWF1 and SWF2

Fig 3.0
However, it is important to use these sorts of exclusive application domains only when necessary because they will increase memory usage. I hope this example has shown the importance of application domain and has given you a better understanding on what application domain you need depending on the result you want.