2014-11-26 3 views
0

얘들 아 내 친구들이 내 갤러리 활동을 열기까지 정말 오래 걸린다. 나는 코드를 살펴 보았고 나는 활동을 느리게 만드는 것을 발견했다고 생각한다. 나는 이미지가 디코딩되는 부분이라고 생각한다. 내 갤러리에 많은 이미지가있을 때 속도가 느려지고 모든 이미지를 디코딩하는 데 시간이 걸리는 것처럼 보입니다. android의 별도 스레드에서 이미지 갤러리 디코딩

내 코드

public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
     imageView = new ImageView(_activity); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    // THIS BELOW IN SEPARATE THREAD 

    Bitmap image = decodeFile(_filePaths.get(position), imageWidth, imageWidth); 

    // THIS ABOVE IN SEPARATE THREAD 

    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, 
      imageWidth)); 
    imageView.setImageBitmap(image); 

    // image view click listener 
    imageView.setOnClickListener(new OnImageClickListener(position)); 

    return imageView; 
} 

내가 테 프로그램 속도를 높일 수있는 별도의 스레드에서 이미지 디코딩 라인을 넣어 생각입니다. 아무도 그것을 어떻게 할 수 말해 줄래?

답변

0

그런 스레드를 사용할 수 없습니다. imageView 변수를 반환하기 때문에 전체 함수는 이미지가 반환되기 전에 디코딩 될 때까지 기다려야합니다. 우선, convertView를 ImageView로 캐스팅하는 이유는 무엇입니까? 그 일을하는 것이 좋습니다. xml을 변경하고 imageView가 없으면 추가해야 할 수도 있습니다. 그런 다음 스레드를 발사, 마지막으로

final ImageView listImage = (ImageView) convertView.findViewById(R.id.listImage); 

같은 것을 사용하여이 기능에서 해당 이미지 뷰에 대한 참조를 얻을 convertView를 반환하면서,이 listImage 변수로 이미지를 설정합니다. ExecuterService를 사용하십시오. 다음은 간단한 예입니다.

private final ExecutorService executorService = Executors.newCachedThreadPool(); 
private final int layoutResourceId; //set this 

    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView==null){ 

      LayoutInflater inflater = (_activity).getLayoutInflater(); 
      convertView = inflater.inflate(layoutResourceId, parent, false); 
     } 
     final ImageView listImage = (ImageView) convertView.findViewById(R.id.listImage); 
     // THIS BELOW IN SEPARATE THREAD 
     executorService.submit(new Runnable() { 
      @Override 
      public void run() { 
       Bitmap image = decodeFile(_filePaths.get(position), imageWidth, imageWidth); 
       listImage.setScaleType(ImageView.ScaleType.CENTER_CROP); 
       listImage.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth)); 
       listImage.setImageBitmap(image); 
       listImage.setOnClickListener(new OnImageClickListener(position)); 
      } 
     }); 

     return convertView; 
    } 

일반적인 생각이 들기를 바랍니다.

피카소를 사용하는 것이 좋습니다. 구글 그것. 당신은 당신 자신의 스레딩을 구현할 필요없이 캐싱의 이점을 얻고 훨씬 적은 수의 코드에서이를 수행 할 수 있습니다. 비트 맵을 재활용하지 않기 때문에 로우 엔드 장치의 메모리가 부족합니다.