큰 비트 맵을 구성하는 타일 묶음을로드하는 단일 스레드 응용 프로그램을 최적화하려고했습니다. 새로운 타일을 시스템 메모리에로드 할 때 앱이 매우 부진 해졌습니다. 지금은이 목적으로 비동기 작업을 사용하려고합니다. 앱은 onDraw가 호출하는 메소드의 왼쪽 상단에있는 타일을 감지하고, Assets 폴더에 비트 맵의 경로가 포함 된 문자열을 만든 다음 그리기 전에 비트 맵이 null인지 확인합니다. null 인 경우, 메모리에로드합니다. 내 생각은 DoBackground에서 비트 맵을 처리하고 postExecute 트리거에서 비동기로드 된 비트 맵을 표시하는보기를 무효화하는 것이 었습니다. 몇 가지 질문 :aSyncTask를 사용하여 비트 맵로드 최적화
1.) 각 비트 맵에 대해 내 aSync 작업을 실행할 수 있습니까? (이 문장은 : new myAsyncTaskManager(). execute (bitmapPath); 그렇지 않은 경우 aSync가 수행 할 수있는 유일한 작업은 메모리에 비트 맵을로드하는 것일 뿐이므로 최선의 방법은 무엇입니까?
2.) 가능한가요? 비트 맵이 너무 느리게로드되는 경우 우선 순위 aSyncTask를 설정 하시겠습니까?
3) 3.이 문제를 해결할 더 좋은 방법이 있습니까? 그것은 비트 맵 로딩이며, 캔버스 드로잉은 앱의 속도를 늦추지 않습니다.
내 일시 비동기 코드 : 당신은() bitmapLoaderThread.run 전화하는거야
private class myAsyncTaskManager extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... bitmapPath) {
Log.e("sys","i ran using aTask");
try {
bitmapArray[rectBeingDrawn] = BitmapFactory.decodeStream(assetManager.open(imagePathToLoad));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
}
@Override
protected void onPostExecute(String result) {
// execution of result of Long time consuming operation
mCampusMap.invalidate();
}
}
416 개의 타일이 있습니다. 고해상도의 경우 평균 15 비트 맵이 그려집니다. 854 x 480 해상도의 내 드로이드와 같은 장치이며 스크롤하는 동안 일반적으로 5 비트 맵을 메모리에로드합니다. 그래서 만약 내가 스레드 경로를 이동했다, 나는 효과적으로 비트 맵을로드 스레드를 호출 할 것이라고? UI 스레드가 null이 아님을 감지하면 자동으로 비트 맵을 그릴 것이므로 아무 것도 반환하지 않아도된다고 생각합니다. myThread.run(); 이전에 didnt 한 일뿐만 아니라 나는 하를 바랐다. – jfisk
나는 똑같은 문제에 직면 해있다. – zIronManBox