java - FLEX - 将 AsyncToken 转换为 ArrayCollection

标签 java apache-flex actionscript arraycollection asynctoken

我是 Flex 新手,我似乎无法让它工作。本质上,我有一个选择框,它的可用数据依赖于另一个组合框。

每个CategoryType中有多个TreatmentType。

这是我的代码:

组合框更改;更新选择框:

private function refreshAvailableTreatmentTypes():void {
        // this is the combo box
        fAccomplishment.habitatType = habitatTypeId.selectedIndex != -1 ? habitatTypeId.selectedItem as HabitatType : null; 
        // fAccompRemote is a RemoteObject
        var treatmentList:ArrayCollection = fAccompRemote.getValidTreatments(fAccompForm.accomplishment, fAccomplishment.habitatType);

        if ( fAccompForm.categoryTypes != null ) {
            // All categories are always shown. These are passed to the form on construction. 
            for each ( var currentCat:CategoryType in fAccompForm.categoryTypes ) {
                var catAdded:Boolean = false;
                /* loop through all the treatments in each Category and add them to 
                 * the available list if they meet the criteria */
                for each ( var currentTreat:TreatmentType in currentCat.treatments ) {
                    if (currentTreat.id in treatmentList || treatmentList.length == 0) {
                        if (!catAdded) {
                            // fCatsAndTreats defined as a [Bindable] private var
                            fCatsAndTreats.addItem( currentCat );
                            catAdded = true;
                        } 

                        fCatsAndTreats.addItem( currentTreat );
                    }
                }
            }
        }
    }

服务方式:

@RemotingInclude
public List<TreatmentType> getValidTreatments(Accomplishment accomp, HabitatType selectedHabitatType){
    if ( accomp == null || accomp.getGeometry() == null || accomp.getHabitatType() == null) {
        return new ArrayList<TreatmentType>();
    }

    Geometry accompGeo = accomp.getGeometry();
    List<TreatmentType> optionList = new ArrayList<TreatmentType>();
    String geomName = null;

    if ( accompGeo instanceof Point || accompGeo instanceof MultiPoint ) {
        geomName = "Point";
    } else if ( accompGeo instanceof LineString || accompGeo instanceof MultiLineString) {
        geomName = "Line";
    } else if ( accompGeo instanceof Polygon || accompGeo instanceof MultiPolygon ) {
        geomName = "Polygon";
    }

    Integer habTypeId = null;
    if (selectedHabitatType == null) {
        habTypeId = accomp.getHabitatType().getId();
    } else {
        habTypeId = selectedHabitatType.getId();
    }
    optionList = accomplishmentDao.getValidTreatments(geomName, habTypeId);

    return optionList;
}

TypeError:错误 #1034:类型强制失败:无法将 mx.rpc::AsyncToken@1af48641 转换为 mx.collections.ArrayCollection。

我该怎么做?我发现THIS但它似乎对我没有多大帮助: 。任何资源或信息将不胜感激。

最佳答案

对 RemoteObject 的调用是异步的 - fAccompRemote.getValidTreatments 的返回值是一个 AsyncToken,它定义了如何处理结果(当返回结果时)。

当远程调用返回时,它将调用结果处理程序或错误处理程序,具体取决于调用是成功还是出现错误。

您可以通过多种不同的方式为您的代码设置响应处理程序 - 您可以在调用中添加EventListener,或者在从调用返回的 AsyncToken 中设置响应程序。

fAccompRemote.addEventListener(ResultEvent.RESULT, resultHandler);
fAccompRemote.getValidTreatments(...)

-或-

var token:AsyncToken = fAccompRemote.getValidTreatments(...);
token.addResponder(new AsyncResponder(resultHandler, faultHandler));

无论哪种情况,resultHandler 都会接收 ResultEvent 事件,以及从 getValidTreatments 返回的 ArrayCollection

protected function resultHandler(event:ResultHandler):void
{
    var results:ArrayCollection = event.result as ArrayCollection;
}

关于java - FLEX - 将 AsyncToken 转换为 ArrayCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23478894/

相关文章:

javascript - Action Script 3. 如何从Flash中的Movie Clip访问按钮?

Java Access Bridge 在 releaseJavaObject() 上使 JVM 崩溃

Java 中的 java.lang.reflect.InitationTargetException

java - 使用 string.format .places java 四舍五入到小数点后两位

java - 在linux上用java运行shell脚本

web-services - 如何使用 FLEX 解析 SOAP 响应

apache-flex - 如何对齐formItems?

java - Flex 和 Java 之间的 RemoteClass 问题

iphone - 制作 iPhone 应用程序时是否可以嵌入或加载 SWF(Apple 是否允许)

ActionScript 3.0 + 计算两个日期之间的时间跨度?