Google지도 v2에서 움직임을 추적하는 앱을 작성 중입니다. 변경된 각 위치에 대해 새 맵 포인트를 배열에 추가 한 다음 폴리 라인을 맵에 추가합니다. 또한 sqlite 데이터베이스에 위치를 저장하고 있습니다. 다음은 관련 코드입니다.
LatLng mapPoint = new LatLng(location.getLatitude(), location.getLongitude());
routePoints.add(mapPoint);
Polyline route = map.addPolyline(new PolylineOptions().color(Color.BLUE).width(2));
route.setPoints(routePoints);
약 2000 포인트 후에 앱이 내 휴대폰에서 응답하지 않습니다. 나는 데이터베이스에서 모든 데이터를 가져올 때 (때로는 6000 개 이상의 행) 배열이 너무 커져서 (배열을 사용하여) 동일한 논리를 따르고 맵을 잘 칠하기 때문에 배열이 너무 커졌다 고 생각하지 않습니다. 메인 스레드 (음악 재생, Google지도, 위치 서비스, 데이터베이스 삽입, 텍스트보기 변경 등)에서 모든 것을 실행하고 있기 때문인지 궁금합니다. 그게 범인이라면 다른 스레드에 넣으려면 어떻게해야합니까? 다른 스레드에는 무엇이 들어가야합니까? 마지막으로, 이러한 것들을 다른 스레드로 옮기는 방법을 작성하는 방법은 무엇입니까 (코드 샘플 또는 리소스를 가리킴).
TIA
이상적으로는 UI를 포함하지 않는 모든 것을 다른 스레드, 특히 네트워킹 및 파일 액세스 (예 : 데이터베이스) 코드로 옮기고 싶을 것입니다. 여기에서 천 컷 상황에 의한 죽음 일 것입니다. 몇 가지 제안 :
위에 제시된 순서대로 변경하는 것이 좋습니다.
수행하려는 작업이 무엇인지는 모르겠지만 AsyncTask를 사용하는 방법에 대한 대략적인 개요는 다음과 같습니다.
private class LocationTask extends AsyncTask<Source, Integer, List<PolylineOptions>> {
protected Long doInBackground(Source... sources) {
List<PolylineOptions> list=new ArrayList<PolylineOptions>();
//create or retrieve Polyline objects here
return list;
}
protected void onProgressUpdate(Integer... progress) {
//don't need this if it's reasonably fast
}
protected void onPostExecute(List<PolylineOptions> result) {
for(PolylineOptions poly:result) {
map.addPolyline(poly);
}
}
}
실행하려면 : new LocationTask().execute(source1, source2, source3);
Source
LocationTask에 해당 기능을 수행 할 수있는 기능을 제공하는 데 사용하는 데이터 구조입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다