サーバーで画像を探す前に画像が読み込まれていない場合、画像を読み込む方法がありました。次に、それをアプリのファイルシステムに保存します。ファイルシステムにある場合は、サーバーからイメージをプルするよりもはるかに高速であるため、代わりにそのイメージをロードします。以前にアプリを閉じずに画像を読み込んだ場合、それは静的辞書に保存されるため、メモリを使い果たすことなく再読み込みして、メモリ不足エラーを回避できます。
Picasso画像読み込みライブラリを使い始めるまで、これはすべてうまくいきました。今私はImageViewに画像をロードしていますが、返されたビットマップを取得してファイルまたは静的辞書に保存できるようにする方法がわかりません。これは物事をより困難にしました。それは毎回サーバーからイメージをロードしようとすることを意味するからです、それは私が起こりたくないことです。 ImageViewに読み込んだ後にビットマップを取得する方法はありますか?以下は私のコードです:
public Drawable loadImageFromWebOperations(String url,
final String imagePath, ImageView theView, Picasso picasso) {
try {
if (Global.couponBitmaps.get(imagePath) != null) {
scaledHeight = Global.couponBitmaps.get(imagePath).getHeight();
return new BitmapDrawable(getResources(),
Global.couponBitmaps.get(imagePath));
}
File f = new File(getBaseContext().getFilesDir().getPath()
.toString()
+ "/" + imagePath + ".png");
if (f.exists()) {
picasso.load(f).into(theView);
**This line below was my attempt at retrieving the bitmap however
it threw a null pointer exception, I assume this is because it
takes a while for Picasso to add the image to the ImageView**
Bitmap bitmap = ((BitmapDrawable)theView.getDrawable()).getBitmap();
Global.couponBitmaps.put(imagePath, bitmap);
return null;
} else {
picasso.load(url).into(theView);
return null;
}
} catch (OutOfMemoryError e) {
Log.d("Error", "Out of Memory Exception");
e.printStackTrace();
return getResources().getDrawable(R.drawable.default1);
} catch (NullPointerException e) {
Log.d("Error", "Null Pointer Exception");
e.printStackTrace();
return getResources().getDrawable(R.drawable.default1);
}
}
どんな助けでも大歓迎です、ありがとう!
ピカソを使用すると、自動的に行われるため、独自の静的辞書を実装する必要はありません。 @intrepidkarthiは、画像が最初にロードされたときにPicassoによって自動的にキャッシュされるため、常にサーバーを呼び出して同じ画像を取得するわけではないという意味で正しかったです。
そうは言っても、同じような状況に陥っていました。アプリケーションの別の場所にビットマップを保存するために、ダウンロードしたビットマップにアクセスする必要がありました。そのために、@ Gilad Haimovの回答を少し調整しました。
Java、古いバージョンのPicasso:
Picasso.with(this)
.load(url)
.into(new Target() {
@Override
public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from) {
/* Save the bitmap or do something with it here */
// Set it in the ImageView
theView.setImageBitmap(bitmap);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {}
@Override
public void onBitmapFailed(Drawable errorDrawable) {}
});
Kotlin、バージョン2.71828のPicasso:
Picasso.get()
.load(url)
.into(object : Target {
override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) {
/* Save the bitmap or do something with it here */
// Set it in the ImageView
theView.setImageBitmap(bitmap)
}
override fun onPrepareLoad(placeHolderDrawable: Drawable?) {}
override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {}
})
これにより、非同期にロードしながら、ロードされたビットマップにアクセスできます。自動的に行われなくなるため、ImageViewで設定することを忘れないでください。
ちなみに、画像の出所を知りたい場合は、同じ方法でその情報にアクセスできます。上記のメソッドの2番目の引数Picasso.LoadedFrom from
は、ビットマップのロード元のソースを知ることができる列挙型です(3つのソースはDISK
、MEMORY
、およびNETWORK
です。( ソース )。Square Inc.は、説明されたデバッグインジケーターを使用して、ビットマップがどこから読み込まれたかを視覚的に確認する方法も提供します こちら 。
お役に立てれば !
Picassoを使用すると、ダウンロードした画像を直接制御できます。ダウンロードした画像をファイルに保存するには、次のようにします。
Picasso.with(this)
.load(currentUrl)
.into(saveFileTarget);
どこ:
saveFileTarget = new Target() {
@Override
public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from){
new Thread(new Runnable() {
@Override
public void run() {
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + FILEPATH);
try {
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 75, ostream);
ostream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
この例では、折りたたみツールバーの背景を設定するために使用しました。
public class MainActivity extends AppCompatActivity {
CollapsingToolbarLayout colapsingToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
colapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.colapsingToolbar);
ImageView imageView = new ImageView(this);
String url ="www.yourimageurl.com"
Picasso.with(this)
.load(url)
.resize(80, 80)
.centerCrop()
.into(image);
colapsingToolbar.setBackground(imageView.getDrawable());
}
お役に立てば幸いです。
あなたはピカソを使用しているので、それを最大限に活用したいと思うかもしれません。強力なキャッシングメカニズムが含まれています。
Picasso
インスタンスでpicasso.setDebugging(true)
を使用して、発生するキャッシュの種類を確認します(ディスク、メモリ、またはネットワークから画像が読み込まれます)。参照: http://square.github.io/picasso/ (デバッグインジケーター)
Picassoのデフォルトのインスタンスは( http://square.github.io/picasso/javadoc/com/squareup/picasso/Picasso.html#with-Android.content.Context- )で構成されています
使用可能なアプリケーションRAMの15%のLRUメモリキャッシュ
2%のストレージスペースのディスクキャッシュ。最大50MBですが、5MB以上です。 (注:これは、API 14以降、またはOkHttpなどのすべてのAPIレベルでディスクキャッシュを提供するスタンドアロンライブラリを使用している場合にのみ使用できます)
また、Picasso.Builder
を使用してCache
インスタンスを指定し、インスタンスをカスタマイズしたり、Downloader
を指定してより細かく制御したりすることもできます。 (ピカソにはOkDownloader
の実装があり、アプリにOkHttp
を含めると自動的に使用されます。)