Skip to main content
Participating Frequently
January 5, 2012
Question

Is Adobe Air doomed?

  • January 5, 2012
  • 4 replies
  • 2765 views

Now that I have your attention - I don't subscribe to the "sky is falling", "Adobe is making the worst mistake ever" kind of panic-based cries out there in regards to the latest strategy shift annoucements regarding flash.

Knowing quite well the capabilities/limitations of HTML5/js, the horrible tooling and the apparent W3C decisions like "let's just ignore Sqllite as a client side db and support an inferior name/value pair store like indexdb with a 2MB limit as a standard", there is no doubt in my mind that Adobe Air is still a phenomenal cross platform mobile development strategy.

This is only true, though, IFF it is also true that Adobe is doubling up on Air for a cross platform native development platform.

Just going through this forum in detail, I see so many unanswered posts (from months ago) and so many people frustrated with the lack of response.  Part of winning people back and turning around the public announcement mistakes recently committed goes through creating a happy developer echo system.  Adobe Air developers should be able to successfully use this phenomenal technology and create significant commercial successes and then the proof will be in the pudding.

Adobe - you have to partially dedicate a number of your Air development team resources to this forum and have every single question properly answered in very little time.  This will dramatically turn around developer loyalty, create a significant number of commercial successes and allow the platform to prove itself as a bellter alternative to HTML5/css3/js.

And - please start by helping me out with my question that has received 0 replies in a week.  Tell me I haven't provided enough information or something - please...!

http://forums.adobe.com/thread/943234

This topic has been closed for replies.

4 replies

Inspiring
January 11, 2012

My company is using Adobe Air to build our mobile app.  I'm an experienced iOS developer.  I can say with confidence that the last 2 months working on this app have been the most frustrating developer months I've spent in the last few years.  It's not that the Adobe Air tools (and more importantly Flex), are necessarily "bad".  Rather, it's the fact that the whole Adobe Air mobile dev ecosystem is incredibly poorly documented for accomplishing specific tasks.  And for me, I find myself running into these edge cases more often than not.

A simple example of this is the following: I would like to access local recorded video on my iOS device.  This is an *extremely* common functionality found in other iOS apps.  Yet, for the life of me, I can't figure out how (or IF) this is possible in Adobe Air mobile.  I've posted on these forums (http://forums.adobe.com/thread/947205?tstart=0) and on StackOverflow (http://stackoverflow.com/questions/8799980/browse-local-video-on-adobe-air-flex-mobile-application), and haven't had a single bite.  Now, granted, I posted this earlier today and it's only been 6 hours since posting.  BUT ... doing this natively in the iOS SDK would have taken me less than 30 minutes.

Maintaining developer loyalty is one of the most important ingredients to building a sustainable developer platform.  If Adobe doesn't keep up with this, Air will surely go the way of the mobile Flash plugin...

Participating Frequently
January 6, 2012

I have created a project that clearly reproduces the bug.  Here are the steps:

1) Create a UrlLoader and point it to https://www.google.com

2) Load it

3) Run in Flash Builder 4.6/Air 3.1 and then run in Android emulator.  The former works with an http status 200.  The latter gives you an ioerror 2032.

Here is the self contained View code which works with a TabbedViewNavigatorApplication:

<?xml version="1.0" encoding="utf-8"?>

<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"

                    xmlns:s="library://ns.adobe.com/flex/spark"

                    xmlns:mx="library://ns.adobe.com/flex/mx"

                    xmlns:ns1="*"

                    xmlns:local="*"

                    creationComplete="windowedapplication1_creationCompleteHandler(event)"

                    actionBarVisible="true" tabBarVisible="true">

          <fx:Script>

                    <![CDATA[

                              import mx.events.FlexEvent;

                              protected var requestTokenUrl:String = "https://www.google.com";

                              protected function windowedapplication1_creationCompleteHandler(event:FlexEvent):void

                              {

                                        var loader:URLLoader = new URLLoader();

                                        loader.addEventListener(ErrorEvent.ERROR, onError);

                                        loader.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError);

                                        loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);

                                        loader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, httpResponseStatusHandler);

                                        loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

                                        var urlRequest:URLRequest = new URLRequest(requestTokenUrl);

                                        loader.load(urlRequest);

                              }

                              protected function requestTokenHandler(event:Event):void

                              {

                              }

                              protected function httpResponse(event:HTTPStatusEvent):void

                              {

                                        label.text += event.status;

                                        // TODO Auto-generated method stub

                              }

                              private function completeHandler(event:Event):void {

                                        label.text += event.toString();

                                        trace("completeHandler data: " + event.currentTarget.data);

                              }

                              private function openHandler(event:Event):void {

                                        label.text +=  event.toString();

                                        trace("openHandler: " + event);

                              }

                              private function onError(event:ErrorEvent):void {

                                        label.text +=  event.toString();

                                        trace("onError: " + event.type);

                              }

                              private function onAsyncError(event:AsyncErrorEvent):void {

                                        label.text += event.toString();

                                        trace("onAsyncError: " + event);

                              }

                              private function onNetStatus(event:NetStatusEvent):void {

                                        label.text += event.toString();

                                        trace("onNetStatus: " + event);

                              }

                              private function progressHandler(event:ProgressEvent):void {

                                        label.text += event.toString();

                                        trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);

                              }

                              private function securityErrorHandler(event:SecurityErrorEvent):void {

                                        label.text +=  event.toString();

                                        trace("securityErrorHandler: " + event);

                              }

                              private function httpStatusHandler(event:HTTPStatusEvent):void {

                                        label.text += event.toString();

                                        //label.text += event.responseHeaders.toString();

                                        trace("httpStatusHandler: " + event);

                              }

                              private function httpResponseStatusHandler(event:HTTPStatusEvent):void {

                                        label.text +=  event.toString();

                                        trace("httpStatusHandler: " + event);

                              }

                              private function ioErrorHandler(event:IOErrorEvent):void {

                                        label.text +=  event.toString();

                                        label.text += event.text;

                                        trace("ioErrorHandler: " + event);

                              }

                    ]]>

          </fx:Script>

          <fx:Declarations>

                    <!-- Place non-visual elements (e.g., services, value objects) here -->

          </fx:Declarations>

          <s:Label id="label" y="185" width="100%" color="#0A0909" horizontalCenter="0" text=""/>

</s:View>

Participant
January 9, 2012

Hi,

 

I building a mobile employee directory and for that I am using Flash Builder 4.6/AIR 3.1.0. I am using RESTful web service to get XML results and to display on my mobile application. I am getting the same below error when accessing the webservice from mobile app (Android - Galaxy Tab 7 inch).

 

Error: [IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error # 2032"] URL: http://adfdevp.alshaya.com:7013/RESTEmployeeDetails-EmployeeDetails-co">http://adfdevp.alshaya.com:7013/RESTEmployeeDetails-EmployeeDetails-co ntext-root/jersey/restlabhttp://adfdevp.alshaya.com:7013/RESTEmployeeDetails-http://adfdevp.als haya.com:7013/RESTEmployeeDetails-EmployeeDetails-co ntext-root/jersey/restlabEmployeeDetails-context-root/jersey/restlab

 

The same code is working in Flash Builder 4.6. I have checked Network Monitor to "Disabled" before deploying to mobile. What am i doing wrong here? I am pasting my code below-

 

 

<?xml version="1.0" encoding="utf-8"?>

<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"

   xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView" xmlns:dao="dao.*"

   xmlns:mx="library://ns.adobe.com/flex/mx">

<fx:Script>

   <![CDATA[

    import mx.collections.ArrayCollection;

    import mx.collections.IList;

    import mx.collections.XMLListCollection;

    import mx.events.FlexEvent;

    import mx.rpc.events.FaultEvent;

    import mx.rpc.events.ResultEvent;

    import mx.rpc.xml.SimpleXMLDecoder;

    import mx.utils.ArrayUtil;

   

    import valueObjects.EmployeeDetail;

    [Bindable]

    private var myXml:XML;

   

    [Bindable]

    public var resultCollection:IList;

    public function handleXml(event:ResultEvent):void

    {

     var xmlListCollection:XMLListCollection = new XMLListCollection(event.result.children());

     var xmlListCollectionValues:XMLListCollection = new XMLListCollection(event.result.emp.children());

     var resultArray:Array = xmlListCollection.toArray();

     var resultArrayValues:Array = xmlListCollectionValues.toArray();

    

    

     var objEmployeeDetails:EmployeeDetail;

     var resultCollection:ArrayCollection = new ArrayCollection();

    

     var j:int = 0;

     for(var i:int=0;i<resultArray.length;i++){

     

      objEmployeeDetails = new EmployeeDetail();

      objEmployeeDetails.brand = resultArrayValues;

      objEmployeeDetails.division = resultArrayValues[j+1];

      objEmployeeDetails.email = resultArrayValues[j+2];

      objEmployeeDetails.employee_name = resultArrayValues[j+3];

      objEmployeeDetails.employee_number = resultArrayValues[j+4];

      objEmployeeDetails.grade = resultArrayValues[j+5];

      objEmployeeDetails.mobile = resultArrayValues[j+6];

      objEmployeeDetails.position = resultArrayValues[j+7];

     

      j = j + 8;

      resultCollection.addItem(objEmployeeDetails);

     

     }

     list.dataProvider = resultCollection;

     //return resultCollection;

    }

   

    public function handleFault(event:FaultEvent):void

    {

     //Alert.show(event.fault.faultDetail, "Error");             

    }

   

    protected function sesrchEmployee():void

    {

     xmlRpc.send();

    }

   

   ]]>

</fx:Script>

<fx:Declarations>

   <dao:EmployeeDAO id="srv"/>

  

   <mx:HTTPService id="xmlRpc"

       url="http://adfdevp.alshaya.com:7013/RESTEmployeeDetails-EmployeeDetails-co ntext-root/jersey/restlab"

       result="handleXml(event)"

       fault="handleFault(event)"

       resultFormat="e4x" showBusyCursor="true">

    <mx:request xmlns="">

     <data>{key.text}</data>

     <data>{key1.text}</data>

    </mx:request>

   </mx:HTTPService>

  

  

</fx:Declarations>

<s:navigationContent/>

<s:titleContent>

   <s:VGroup width="100%">

   <s:HGroup width="100%">

    <s:Label top="40" paddingTop="10" paddingRight="13" height="29" text="Employee Name:"/>

    <s:TextInput id="key" width="559"/>

   </s:HGroup>

   <s:HGroup width="100%">

    <s:Label height="30" paddingTop="10" text="Employee Number:"/>

    <s:TextInput id="key1" width="100%"/>

   </s:HGroup>

  

   </s:VGroup>

</s:titleContent>

<s:actionContent>

   <s:Button icon="@Embed('assets/search.png')" click="sesrchEmployee()"/> 

</s:actionContent>

<s:List id="list" top="0" bottom="0" left="0" right="0" 

    change="navigator.pushView(EmployeeDetails, list.selectedItem)">

   <s:itemRenderer>

    <fx:Component>

     <s:IconItemRenderer label="{data.employee_name}"

          messageField="position">

     </s:IconItemRenderer>

    </fx:Component>

   </s:itemRenderer>

</s:List>

</s:View>

 

Please help me to resolve this issue as soon as possible. Appreciate your quick response in this regard.

 

Thanks,

 

Murtaza Ghodawala

Mobile: +965 97180549

murtaza_ghoda82@hotmail.com

Inspiring
January 5, 2012

adobe needs to keep UPDATING FLASH/AIR for better mobile support and performance

developers need to keep CREATING WELL-PERFORMING flash apps

this forum needs more smart people GIVING ANSWERS:

"Adobe - you have to partially dedicate a number of your Air development team resources to this forum and have every single question properly answered in very little time.  This will dramatically turn around developer loyalty, create a significant number of commercial successes and allow the platform to prove itself as a better alternative to HTML5/css3/js"

//---

if the above ever happens, the flash community will expand with better developers who actually know what they're doing... which means better flash apps... which means consumers who happily buy flash apps instead of avoiding them or leaving 1-star reviews saying how terrible the app was...

Inspiring
January 5, 2012

Unfortunately - this is so true... :/ I love AIR & Flex and would not trade it for anything else. But the community is so weak... I also have a lot of unanswered (or self-answered) threads

Colin Holgate
Inspiring
January 5, 2012

Just as a point of interest, his question had too much details. Sometimes you need to try and narrow down the problem to a specific issue. The post was so long that most people wouldn't read ll of it, and if you did you had to then figure out what the main question was. I still haven't managed to wade through all of it.

Participating Frequently
January 6, 2012

Colin,

Maybe - maybe not.  When I have a situation where some unknown is happening, I try to gather as much info as possible to see if any of it rings a bell to someone.

That said, I am trying to create a simple project that demonstrates the bug clearly and I will post it if and when I have it.