2012-10-26 3 views
5

네트워크를 통해 검색된 이미지 목록이있는 목록보기가있는 응용 프로그램을 테스트하고 있습니다. 안드로이드 장치 2.3.3 (WIFI 속도 512 KBPS)에서 응용 프로그램을 실행하고 DDMS (스레드 뷰어)를 확인하면 스레드 수가 25에서 50까지 계속 증가합니다. 그러나 장치 4.0에서 같은 응용 프로그램을 테스트 할 때 (WIFI 속도 5 MBPS), 스레드 수가 증가하지 않았습니다.2.3.3 및 4.0 OS에서 비동기 작업 동작

왜 이런 일이 일어 났는지 이해할 수 있습니까? 그것은 안드로이드 OS 차이 또는 다른 이유로 인해입니까?

미리 감사드립니다.

+1

는 관련 코드를 게시하시기 바랍니다 즐기세요! – vikki

+0

나는 apk 파일 만 가지고 있습니다. 나는 코드를 가지고 있지 않다. – Prem

답변

13

당신은 AsyncTask을 (를) 사용하고 있습니까? Android 3.0 이후에는 기본 동작 인 AsyncTask이 SERIAL_EXECUTOR를 사용하여 단일 스레드에서 실행됩니다.

AsyncTask을 임의의 시스템 버전에서 동시에 실행하려면이 코드를 사용할 수 있습니다.

AsyncTask task = new YourTask(); 
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { 
    task.execute(params); 
} else { 
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
} 

프리 OS 1.6 - 여러 개의 비동기 작업이 차례대로 실행됩니다. OS 1.6에서 OS 2.3까지 - 비동기 작업이 병렬로 실행됩니다. 3.0 - 다시 Async Tasks가 순서대로 실행됩니다.

+1

왜 디자인 선택을했는지에 관한 어떤 단어가 있습니까? –

1

AsyncTask를 사용하여 백그라운드 작업을 실행하고 있습니까? 나는 GB와 ICS 사이의 AsyncTask 구현 사이에 차이가 있다고 생각한다.

스레드가 작업을 끝내고 두 버전간에 차이가 있는지 확인하기 위해 일부 디버그 로깅을 추가하십시오.

+0

감사합니다 dnkoutso ... 예, 비동기 작업은 백그라운드 작업을 실행하는 데 사용됩니다. 어떤 종류의 디버그 로깅을 사용하면 더 잘 이해할 수 있습니까? – Prem

+0

스레드가 완료되면. asynctask 내부적으로 사용되는 고정 된 스레드 풀이있을 수 있습니다. 스레드가 있다는 사실은 아무런 의미도 없으며 필요한 경우 재사용됩니다. – dnkoutso

0

API에 대해 AsyncTaskCompat.executeInParallel을 사용할 수 있습니다. < 11,이 클래스는 appcompat v4 라이브러리에서 찾을 수 있습니다. 사용

exemple :

AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Bitmap>() { 
     @Override 
     protected Bitmap doInBackground(Void... params) { 
      return MediaStore.Images.Thumbnails.getThumbnail(
        imageView.getContext().getContentResolver(), 
        id, 
        MediaStore.Images.Thumbnails.MINI_KIND, 
        null); 
     } 
     @Override 
     protected void onPostExecute(Bitmap bitmap) { 
      imageView.setImageBitmap(bitmap); 
      if (bitmap != null) { 
       // Add the image to the memory cache first 
       CACHE.put(id, bitmap); 
       if (listener != null) { 
        listener.onImageLoaded(bitmap); 
       } 
      } 
     } 
    });