java - 为什么final变量没有内部类就返回?

标签 java android arraylist

我想在 Android 中返回 final ArrayList,但是 ArrayList 总是返回大小 0。我执行 add() 在内部类中,但是返回日志比内部类日志更快。

我的代码:

public static ArrayList<SportsData> getSportsFavorite(){
    final ArrayList<SportsData> sportsDatas = new ArrayList<>();

    DBRequestData reqData = new DBRequestData();
    reqData.cmdId = CmdConst.DISCIPLINE_DATA.SELECT_ALL.ordinal();
    DisciplineCmd cmd = new DisciplineCmd();
    cmd.requestCmd(reqData, new OnDatabaseListener() {
        @Override
        public void onDBResponse(BaseCmd command) {
            if (command == null || command.getResponseData() == null) {
                return;
            }

            ArrayList<DisciplineTable> dbDisciplineList = command.getResponseData().disciplineTableList;
            if (dbDisciplineList == null) {
                return;
            }

            if(sportsFavoriteList.size() == 0) {
                init();
            }

            for (DisciplineTable disciplineData : dbDisciplineList){
                for (String favoriteCode : sportsFavoriteList){
                    String[] codeArr = favoriteCode.split("[|]");
                    String discCode = codeArr[0];
                    String compeCode = codeArr[1];

                    if(disciplineData.disciplineCode.equals(discCode) && disciplineData.competitionCode.equals(compeCode)){
                        int imgRes = SportsUtil.getSportsImgResource(disciplineData.disciplineCode, disciplineData.competitionCode);
                        sportsDatas.add(new SportsData(imgRes, disciplineData));
                        Log.e("SportsUtil", "inner Size : "+sportsDatas.size()); // RETURN SECOND -
                    }
                }
            }
        }
    });

    Log.e("SportsUtil", "Return Size : "+sportsDatas.size()); //RETURN FIRST
    return sportsDatas;
}

日志猫:

07-22 14:33:32.337      651-651/com.samsung.riowow.result E/SportsUtil﹕ Return Size : 0
07-22 14:33:32.347      651-651/com.samsung.riowow.result E/SportsUtil﹕ inner Size : 1
07-22 14:33:32.347      651-651/com.samsung.riowow.result E/SportsUtil﹕ inner Size : 2
07-22 14:33:32.347      651-651/com.samsung.riowow.result E/SportsUtil﹕ inner Size : 3
07-22 14:33:32.347      651-651/com.samsung.riowow.result E/SportsUtil﹕ inner Size : 4
07-22 14:33:32.347      651-651/com.samsung.riowow.result E/SportsUtil﹕ inner Size : 5

想要的结果是ArrayList,大小为5。但总是返回ArrayList的大小为0。请帮助我:)谢谢。



解决

如果你想知道这种情况的原因,请查看Florian Schaetz的回答。

我的解决方案是,我更改方法的返回类型并添加interface监听器参数。请检查我的解决方案。

首先,Create接口(interface)和方法有你想要返回的参数。

public static interface SportsDataListener{
    public void onSportsDataResponse(ArrayList<SportsData> sportsDataList);
}

其次,将方法的返回类型更改为void并添加接口(interface)参数。并调用接口(interface)的方法而不是返回

public static void getSportsFavorite(final SportsDataListener listener){
    final ArrayList<SportsData> sportsDatas = new ArrayList<>();
    DBRequestData reqData = new DBRequestData();
    reqData.cmdId = CmdConst.DISCIPLINE_DATA.SELECT_ALL.ordinal();
    DisciplineCmd cmd = new DisciplineCmd();
    cmd.requestCmd(reqData, new OnDatabaseListener() {
        @Override
        public void onDBResponse(BaseCmd command) {
            if (command == null || command.getResponseData() == null) {
                return;
            }

            ArrayList<DisciplineTable> dbDisciplineList = command.getResponseData().disciplineTableList;
            if (dbDisciplineList == null) {
                return;
            }

            if(sportsFavoriteList.size() == 0) {
                init();
            }

            for (DisciplineTable disciplineData : dbDisciplineList){
                for (String favoriteCode : sportsFavoriteList){
                    String[] codeArr = favoriteCode.split("[|]");
                    String discCode = codeArr[0];
                    String compeCode = codeArr[1];

                    if(disciplineData.disciplineCode.equals(discCode) && disciplineData.competitionCode.equals(compeCode)){
                        int imgRes = SportsUtil.getSportsImgResource(disciplineData.disciplineCode, disciplineData.competitionCode);
                        sportsDatas.add(new SportsData(imgRes, disciplineData));
                    }
                }
            }
            listener.onSportsDataResponse(sportsDatas);
        }
    });
}

最后,你可以使用

SportsUtil.getSportsFavorite(new SportsUtil.SportsDataListener() {
    @Override
    public void onSportsDataResponse(ArrayList<SportsData> sportsDataList) {
        //Some action you want to do. You can use parameter
    }
}

最佳答案

对我来说似乎相当异步。您正在调用一个方法并给它一个回调,该回调将在操作完成后调用,这里可能是在数据库返回之后。主代码没有被阻塞,而是继续执行,而另一个 OnDatabaseListener 在后台等待答案,因此您的方法返回原始列表,然后随着数据库答案的返回,该列表突然增长。

关于java - 为什么final变量没有内部类就返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31554735/

相关文章:

java - 以编程方式检查是否授予锁定?

android - 升级androidx时资源 'attr/visibility'的值重复

Android,如何使 AVD 变小?

java - 将 List<Class> 中的值添加到 Jtable

java - Java 中有没有内置的方法来打印样式文本?

java - 真实注销BaseGameActivity

java - ClassCastException 与 "inconvertible types"编译错误

android - 我们可以在暂停之前在 startActivity() 之后执行代码吗?

arrays - Winbugs 出现 "Array index is less than one"错误

java - ArrayList 越界异常