효율성을 높이기 위해 가능한 한 서버에 액세스하려고합니다. 내가 가지고있는 if-elseif-else 블록으로이 일을 처리했다고 생각했지만, 여전히 내가 원하는 것보다 더 많은 시간이 걸린다. 이것이 개선 될 수있는 방법이 있습니까? 현재의 양식에서는이 섹션을 진행하는 데 2 분 이상이 소요됩니다. 나는 가능한 한 빨리 그것을 좋아할 것이 분명하다.JSON 구문 분석 최적화 - ID와 연결된 이름 가져 오기
JSON에서 룰 (rune) 번호 만 독점적으로 반환하면 즉시 적용됩니다. 그러나 내가해야 할 일은 ID와 관련된 이름을 찾아서 반환하는 것입니다. 코드 섹션에서 traceview를 수행하고 아래에 포함 시켰습니다. 그것을 읽는 방법을 잘 모르겠지만 잘못 섹션 ID (getRuneInfo)에서 이름을 얻는 나의 방법입니다 확신합니다.
궁극적으로, ID 이름 쌍이 로컬에 저장되므로 시간이 지남에 따라 서버에 로컬로이 정보를 저장하는 것이 좋습니다. 어떻게해야할지 모르겠습니다.
Traceview 파일 : https://www.dropbox.com/s/4fc6kdk35wackwr/RuneLoop.trace
루프 :
// Loop through pages, page names stored in string array
for (int i = 0; i < rune.length(); i++) {
JSONObject c = rune.getJSONObject(i);
JSONArray slots = c.getJSONArray(TAG_SLOTS);
name[i] = c.getString(TAG_NAME);
// This loop is where the slowdown is. Before I added this
// the code ran very quickly.
for (int x = 0; x < 27; x++) {
JSONObject s = slots.getJSONObject(x);
if (Integer.valueOf(s.getString(TAG_RUNEID)).equals(prevId)) {
runesArray[i][x] = runesArray[i][x - 1];
prevId = Integer.valueOf(s.getString(TAG_RUNEID));
} else if (Integer.valueOf(s.getString(TAG_RUNEID)).equals(runeIdArray[Integer.valueOf(s.getString(TAG_RUNEID))]))
runesArray[i][x] = runeIdArray[Integer.valueOf(s.getString(TAG_RUNEID))];
else
// I believe the slowdown stems specifically from this
runesArray[i][x] = getStaticData.getRuneInfo(s.getString(TAG_RUNEID));
runeIdArray[Integer.valueOf(s.getString(TAG_RUNEID))] = runesArray[i][x];
}
getRuneInfo 방법 :
public String getRuneInfo(String runeId) {
String name = null;
try {
name = new GetRunes()
.execute(runeId)
.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return name;
}
else 문이 시작되는 getRuneInfo를 호출합니다. 나는 모든 가져 오기가 그것을 느리게한다고 믿습니다. GetRunes :
public static class GetRunes extends AsyncTask<String, String, String> {
protected String doInBackground(String[] runeId) {
String url = "https://prod.api.pvp.net/api/lol/static-data/" + region + "/v1.2/rune/" + runeId[0] + "?api_key=" + api_key;
JSONParser jsonParser = new JSONParser();
JSONObject runeInfo = jsonParser.getJSONFromUrl(url);
String name = null;
try {
name = runeInfo.getString("name");
} catch (JSONException e) {
e.printStackTrace();
}
return name;
}
}
귀하의 질문에 명확하지 않습니다. 그래도 재미있는 것 같습니다! 루틴을 완료하는 데 2 분이 걸리는 지점과 ID에 연결된 이름을 가져와야하는 위치를 명확하게 지적 할 수 있습니까? – rupps
@rupps 물론입니다! 내 메인 포스트를 편집하십시오. 편집 : 완료 – Nate