2015-02-10 2 views
-2

Я пытаюсь создать Лигу легенд APP. У меня есть проблема, которую я не могу решить. Я объявил Hashmap и ArrayList. Сначала я получаю данные из парсинга API League of Legend с использованием JSON. Затем я передаю данные в Hashmap. Однако когда я пытаюсь передать данные в Hashmap из другого метода в другом классе. Это не работает. enter code here if (response.isSuccessful()) { JSONObject jsonObj = новый JSONObject (jsonData); Участники JSONArray = jsonObj.getJSONArray («участники»); mourTeamSummonerList = new ArrayList>(); menemyTeamSummonerList = new ArrayList>();положить значение внутри Hashmap из другого метода внутри другого класса

    for(int i = 0; i< participants.length();i++){ 
         JSONObject p = participants.getJSONObject(i); 
         long teamId = p.getLong("teamId"); 
         HashMap<String, Object> participant = new HashMap<String, Object>(); 
         if(teamId == 100){ 

          long championId = p.getLong("championId"); 
          String summonerName = p.getString("summonerName"); 
          long summonerId = p.getLong("summonerId"); 
          if(summonerName==IDName){ 
           ifOurTeam = true; 
          } 

          participant.put("summonerName",summonerName); 
          methods.ChampionSquare(championId, participant); 
          participant.put("summonerId",summonerId); 
          methods.getSummonerInfoFromId(summonerName,participant); 
          System.out.println(participant); 
          mourTeamSummonerList.add(participant); 
         } 
         if(teamId == 200){ 

          long championId = p.getLong("championId"); 
          String summonerName = p.getString("summonerName"); 
          long summonerId = p.getLong("summonerId"); 

          participant.put("summonerName",summonerName); 
          methods.ChampionSquare(championId, participant); 
          participant.put("summonerId",summonerId); 
          methods.getSummonerInfoFromId(summonerName,participant); 
          System.out.println(participant); 
          menemyTeamSummonerList.add(participant); 
         } 

public class Methods { 
public void getSummonerInfoFromId(final String SumName, final HashMap<String, Object> participant) { 

    OkHttpClient client = new OkHttpClient(); 
    Request request = new Request.Builder() 
      .url("https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/"+SumName.replace(" ","")+"?api_key=7c75d244-fad7-4d18-8038-02a75287fce2") 
      .build(); 

    Call call = client.newCall(request); 
    call.enqueue(new Callback() { 


     @Override 
     public void onFailure(Request request, IOException e) { 
      getSummonerInfoFromId(SumName,participant); 
     } 

     @Override 
     public void onResponse(Response response) throws IOException { 


      try { 
       String jsonData = response.body().string(); 



        JSONObject jsonObj = new JSONObject(jsonData); 
        JSONObject game = jsonObj.getJSONObject(SumName.toLowerCase().replace(" ","")); 

        String summonerLevel = Long.toString(game.getLong("summonerLevel")); 


        participant.put("summonerLevel",summonerLevel); 


      } 
      catch (IOException e) { 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

     } 
    }); 

} 
     public void ChampionSquare(final long championId, final HashMap<String, Object> participant) { 
    if(championId==1){ 
     participant.put("championId", R.drawable.annie); 
    } 
    else if(championId==2){ 
     participant.put("championId",R.drawable.olaf); 
    } 
    else if(championId==3){ 
     participant.put("championId",R.drawable.galio); 
    } 
    else if(championId==4){ 
     participant.put("championId",R.drawable.twistedfate); 
    } 
    else if(championId==5){ 
     participant.put("championId", R.drawable.xinzhao); 
    } 

Когда я распечатать HashMap, он печатает частично правильные ключи и значения для summonerName, championId и summonerId. Я считаю, что то, что я сделал неправильно ставит ключ и значение внутри InnerClass Hashmap:

  • {summonerName = whoiam2, championId = 2130837580, summonerId = 20647588} {summonerName = StillHere4U, championId = 2130837617, summonerId = 43639591} {summonerName = StillThere4U, championId = 2130837564, summonerId = 47639078} {summonerName = Kairu Rengu, championId = 2130837584, summonerId = 22276202} {summonerName = halmooncircle, championId = 2130837573, summonerId = 31202000} {summonerName = NineWorlds , championId = 2130837576, summonerId = 31544164} {summonerName = Masterzeus92, championId = 2 130837672, summonerId = 34979540} {summonerName = Feeeeeeeeeeeeesh, championId = 2130837577, summonerId = 27273581} {summonerName = savedolphins, championId = 2130837664, summonerId = 40901971} {summonerName = Лаки Th1rt33n, championId = 2130837660, summonerId = 34587805}

+0

В чем вопрос? – immibis

+0

Когда я распечатываю Hashmap, он печатает частично правильные ключи и значения для summonerName, championId и summonerId.Отсутствует ключ summonerLevel, потому что я кладу ключ внутри внутреннего класса? и как это исправить? –

+0

Что неверно в идентификаторах? – immibis

ответ

0

Это:

new Callback() { 


    @Override 
    public void onFailure(Request request, IOException e) { 
     getSummonerInfoFromId(SumName,participant); 
    } 

    @Override 
    public void onResponse(Response response) throws IOException { 


     try { 
      String jsonData = response.body().string(); 



       JSONObject jsonObj = new JSONObject(jsonData); 
       JSONObject game = jsonObj.getJSONObject(SumName.toLowerCase().replace(" ","")); 

       String summonerLevel = Long.toString(game.getLong("summonerLevel")); 


       participant.put("summonerLevel",summonerLevel); 


     } 
     catch (IOException e) { 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

не установлен ключ "summonerLevel". Он создает Callback, который, , когда его метод onResponse называется, устанавливает ключ summonerLevel. Затем вы передаете это Callback в call.enqueue.

Исходя из названия, я предположил бы, что call.enqueueделает не сделать запрос сразу же, и поэтому он не вызывает onResponse сразу, и поэтому ключ «summonerLevel» не приготовьтесь сразу.

В какой-то момент позже, вызов будет завершена, onResponse метод обратного вызова будет называться, и вы будете установить ключ «summonerLevel» - но это будет долго после того, как вы уже напечатали.

Посмотрите, есть ли способ дождаться завершения вызова. Затем дождитесь завершения вызова перед возвратом с getSummonerInfoFromId.

+0

Тогда я считаю, что я не должен запрашивать это асинхронно –

+0

Ой, это действительно сработало, все, что мне нужно было сделать, это избавиться от call.enque –

Смежные вопросы