我想在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;
}
Logcat:
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
侦听器参数。请检查我的解决方案。
首先,创建界面和方法有您想要返回的参数。
public static interface SportsDataListener{
public void onSportsDataResponse(ArrayList<SportsData> sportsDataList);
}
其次,将方法的返回类型更改为void并添加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
}
}
答案 0 :(得分:4)
似乎与我非常不同步。您正在调用一个方法并为其提供一个回调,该回调将在操作完成后调用,这可能是在数据库返回之后。主代码没有被阻止,但是一个,而另一个OnDatabaseListener在后台等待答案,因此你的方法返回原始列表,然后随着数据库答案的返回突然增长。
答案 1 :(得分:0)
我猜你的onDBResponse方法正在不同的线程中运行。您正在修改该方法中的arraylist。所以在修改arraylist之前,在这种情况下返回。总是它会给你一个大小为0的arraylist。
答案 2 :(得分:0)
您应该为getSportsFavorite()
提供一个回调接口,该接口将数组列表作为参数,并在完成OnDatabaseListener
方法时调用它。
答案 3 :(得分:0)
是的,问题是因为在方法返回数组列表后调用了onDBResponse()。您应该根据日志的顺序怀疑这一点。
<强>解强>
假设您要求同步获取阵列列表。就在您cmd.requestCmd
之前:
final Object lock = new Object();
然后在return sportsDatas;
:
synchronized(lock) {
lock.wait();
}
并在onDBResponse()
末尾添加:
synchronized(lock) {
lock.notify();
}
基本上,现在你的方法将等到DB的响应到来之后才返回数组列表。
您将需要捕获InterruptedException以及它! 希望能帮助到你! :)
答案 4 :(得分:0)
你必须至少运行一次DBResponse。
public static void main(String[] args) {
final List<String> sportsDatas = new ArrayList<>();
Commond commond = new Commond() {
@Override
public void onDBResponse() {
sportsDatas.add("1");
sportsDatas.add("2");
sportsDatas.add("3");
}
};
System.out.println(sportsDatas.size());
commond.onDBResponse();
System.out.println(sportsDatas.size());
}
}
输出:
0
3