2017-10-27 6 views
1

Picassoターゲットを使用してアダプタのgetView()関数内で画像をダウンロードして保存しようとしています。私は画像を指すURLを持っています。この画像は電話に保存されます。イメージが既に保存されている場合は、電話機のメモリとディスプレイから取得し、そうでなければピカソターゲットを使用してビットマップを電話機のストレージに保存します。私の問題は、ターゲットがonBitmapLoaded関数に決して入らず、onBitmapFailedにしか行きません。したがって、保存はonBitMapLoaded関数で行われるため、私のビットマップは決して電話機ストレージに保存されません。アダプタのgetView()内からのピカソターゲット

以下のコードはgetView()関数で、try catchブロックの内側にファイルが既にディスクに保存されているかどうかを確認します。そうであれば、ファイルをビットマップとしてデコードし、それをimageViewに表示しようとします。それ以外の場合は、ピカソターゲットを使用して画像をダウンロードします。以下は

 @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; 
     } 

(文字列のURL、ImageViewのImageViewの)

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; 
} 

でgetTarget機能がonBitmapLoadedに入ることはありませんなぜ私は理解していないでgetTargetためのコードです。また、このコードでimageView内に画像が表示されない理由を理解できません。どんな助けでも大歓迎です。

答えて

0

上記のコードは機能します。 wifiがダウンしたので、私はURLからイメージを受け取ったことはなかった...本当にそのような問題で非常に時間を無駄にしてしまった。まだ間違っているコードの唯一の部分は、ビットマップをSDカードに保存しようとする部分です。まだ私が間違っていることを理解しようとしていますが、私が解決策を投稿します。

関連する問題