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内に画像が表示されない理由を理解できません。どんな助けでも大歓迎です。