2010-08-04 10 views
0

큰 비트 맵을 구성하는 타일 묶음을로드하는 단일 스레드 응용 프로그램을 최적화하려고했습니다. 새로운 타일을 시스템 메모리에로드 할 때 앱이 매우 부진 해졌습니다. 지금은이 목적으로 비동기 작업을 사용하려고합니다. 앱은 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(); 
} 
} 

답변

2

: 당신의 완전히 새로운 질문에 새로운 해답을 추가

  1. 비트 맵의 ​​양에 따라 달라집니다. 몇 명이나 있니? 수십 개의 스레드를 생성하고 싶지는 않습니다. 결국 하드웨어에 코어가 하나 밖에 없기 때문에 여러 스레드를 사용하면 아무 것도 사지 않을 것입니다. 컨텍스트 스위칭으로 인해 문제가 생길 수 있습니다. 만약 당신이 비트 맵을 가지고 있다면, 당신은 비트 맵의 ​​큐를 가지고 그것을 작업하고 싶을 것입니다. 이를 위해 Thread와 Handler가 실제로 더 좋을 것입니다.

  2. 입니다. 일반적으로, 나는 작업자 쓰레드를 메인 쓰레드보다 우선 순위가 낮은 하나의 우선 순위 레벨로 설정했다.

+0

416 개의 타일이 있습니다. 고해상도의 경우 평균 15 비트 맵이 그려집니다. 854 x 480 해상도의 내 드로이드와 같은 장치이며 스크롤하는 동안 일반적으로 5 비트 맵을 메모리에로드합니다. 그래서 만약 내가 스레드 경로를 이동했다, 나는 효과적으로 비트 맵을로드 스레드를 호출 할 것이라고? UI 스레드가 null이 아님을 감지하면 자동으로 비트 맵을 그릴 것이므로 아무 것도 반환하지 않아도된다고 생각합니다. myThread.run(); 이전에 didnt 한 일뿐만 아니라 나는 하를 바랐다. – jfisk

+0

나는 똑같은 문제에 직면 해있다. – zIronManBox

2

기다립니다? 이 코드는 컨텍스트가없는 코드 조각 (어떤 스레드가 실행 중인지, 어떤 기능이 있습니까?)이지만 run()을 호출하지 않기 때문에 상황이 어떻게되는지 파악하는 것이 어렵습니다. 이것이 운영 체제의 작업입니다! 새 스레드를 시작하려면 start()를 호출합니다. 그러면 새 스레드가 만들어지고 run() 함수가 호출됩니다. run을 직접 호출하면 여전히 자신의 스레드에서 호출됩니다.

그 외 - 두 스레드간에 핸드 셰이크를 어떻게 수행합니까? 작업자 스레드가 비트 맵이로드되었음을 주 스레드에 알리는 방법은 무엇입니까? 이를 위해 Handler를 사용하거나 Thread 대신 AsyncTask를 사용할 수 있습니다.