2017-10-27 6 views
1

피카소 타겟을 사용하는 어댑터의 getView() 함수 안에 이미지를 다운로드하고 저장하려고합니다. 나는 이미지를 가리키는 URL을 가지고있다. 이 이미지는 휴대 전화에 저장됩니다. 이미지가 이미 저장되어있는 경우 휴대폰 메모리와 디스플레이에서 이미지를 검색합니다. 그렇지 않으면 피카소 타겟을 사용하여 비트 맵을 휴대 전화의 저장 공간에 저장합니다. 내 문제는, 대상이 onBitmapLoaded 함수를 절대로 입력하지 않는다는 것입니다. onBitmapFailed로만 이동합니다. 따라서 저장은 onBitMapLoaded 함수에서 발생하므로 내 비트 맵은 절대로 휴대 전화 저장소에 저장되지 않습니다.피카소 타겟에서 어댑터의 getView()

아래 코드는 getView() 함수입니다. 아래쪽의 try catch 블록 안에 파일이 이미 디스크에 저장되어 있는지 확인합니다. 그렇다면 파일을 Bitmap으로 디코딩하여 imageView에 표시하려고합니다. 그렇지 않으면 Picasa 대상을 사용하여 이미지를 다운로드합니다.

 @Override 
     public View getView(int position, View convertView, ViewGroup viewGroup) { 
      // Get or create the feedback wrapper to allow click feedback 
      LinearLayoutFeedback feedbackWrapper; 
      final ImageView imageView; 

      // First try to reuse previous views if available 
      if (convertView != null) { 
       feedbackWrapper = (LinearLayoutFeedback) convertView; 
       imageView = (ImageView) feedbackWrapper.getChildAt(0); 
      } 

      // If not create new views 
      else { 
       feedbackWrapper = new LinearLayoutFeedback(viewGroup.getContext()); 
       imageView = new ImageView(viewGroup.getContext()); 
       imageView.setLayoutParams(new ViewGroup.LayoutParams(PHOTOSTREAM_PICTURE_WIDTH, PHOTOSTREAM_PICTURE_HEIGHT)); 
       imageView.setPadding(0, 0, 0, 0);//padding for image tiles 
       imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
       //imageView.setBackgroundColor(getResources().colorForClass(R.color.pstream_black)); 
       feedbackWrapper.addView(imageView); 
      } 

      int circularPosition = getCircularPosition(position); 
      Photo photo = getPhotoData().get(circularPosition); 

      //Below line was commented out, and instead of using an ImageRequest to load into ImageView, we just use Picasso, it's easier and, handles 
      //errors better 
//   loadImage(photo.imageMed, imageView); 

      final String url = photo.imageMed; 
      try{ 
       String fileName = Environment.getExternalStorageDirectory().getPath() + "/" + url; 
       File pic = new File(fileName); 
        if(pic.exists()){ 
         Bitmap bitmap = BitmapFactory.decodeFile(fileName); 
         imageView.setImageBitmap(bitmap); 
        }else{ 
//     loadImageWithPicasso(photo.imageMed, imageView); 
         final Target target = getTarget(url, imageView); 
         Picasso.with(getContext()).load(url).into(target); 
         imageView.setTag(target); 
       } 
      }catch (Exception e){ 
       e.printStackTrace(); 
      } 
      return feedbackWrapper; 
     } 

는 아래 getTarget 기능이 onBitmapLoaded하지 진입하는 결코 왜 이해가 안 getTarget에 대한 코드 (문자열 URL, 이미지 뷰의 이미지 뷰)

Target getTarget(final String url, final ImageView imageView){ 
    Target target = new Target(){ 
     @Override 
     public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { 
      imageView.setImageBitmap(bitmap); 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + url); 
        try { 
         file.createNewFile(); 
         FileOutputStream ostream = new FileOutputStream(file); 
         bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream); 
         ostream.flush(); 
         ostream.close(); 
        } catch (IOException e) { 
         Log.e("IOException", e.getLocalizedMessage()); 
        } 
       } 
      }).start(); 
     } 
     @Override 
     public void onBitmapFailed(Drawable errorDrawable) { 
      imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.art_white));    } 
     @Override 
     public void onPrepareLoad(Drawable placeHolderDrawable) { 
      imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.art_white));    } 
    }; 
    return target; 
} 

입니다. 이 코드가있는 imageView 내부에 이미지가 표시되지 않는 이유를 이해할 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

0

위의 코드가 작동합니다. Wi-Fi가 꺼져서 URL에서 이미지를 수신하지 못했습니다 ... 그런 문제에 너무 많은 시간을 낭비했습니다. 여전히 잘못된 코드의 유일한 부분은 비트 맵을 SD 카드에 저장하려고하는 부분입니다. 여전히 내가 뭘 잘못하고 있는지 파악하려고 시도하지만, 할 때, 나는 해결책을 게시 할 것입니다.