2015-07-22 66 views
0

我想在Android中返回finalArrayList,但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。請幫我:)謝謝。



求解

如果你想知道這種情況的原因,請檢查弗洛裏安Schaetz的答案。

我的解決方案爲此,我更改了返回類型的方法並添加了interface偵聽器參數。請檢查我的解決方案。

首先,創建接口和方法有你想返回的參數。

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

其次,更改方法的返回類型爲void,並添加接口參數。並調用接口的方法,而不是返回

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 
    } 
} 

回答

4

似乎很異步給我。你正在調用一個方法,並給它一個回調,這個回調將在動作完成後被調用,這裏可能在數據庫返回之後。主代碼不會被阻塞,而會變成一​​個,而另一個OnDatabaseListener在後臺等待答案,因此您的方法會返回原始列表,然後在數據庫答案返回時該列表突然增長。

0

我想你的onDBResponse方法正在不同的線程中運行。您正在修改該方法內的數組列表。所以在這種情況下修改ArrayList返回。總是會給你大小爲0的數組列表。

0

你應該提供一個回調接口到getSportsFavorite(),它將數組列表作爲參數,並在完成OnDatabaseListener方法時調用它。

0

是的問題是因爲你的onDBResponse()方法返回數組列表後調用。您應該從日誌的順序中懷疑這一點。

SOLUTION

假設這是你的要求,你得到的數組列表同步。就在您的cmd.requestCmd做:

final Object lock = new Object(); 

然後在你return sportsDatas;補充一點:

synchronized(lock) { 
    lock.wait(); 
} 

onDBResponse()添加結束:

synchronized(lock) { 
    lock.notify(); 
} 

從本質上講,現在你的方法將等到在返回數組列表之前來自DB的響應已經到來。

您將需要捕獲InterruptedException,就是這樣! 希望它有幫助! :)

0

您必須至少運行一次數據庫響應。

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 
相關問題