我有一个应用程序,用户从云端,内部存储或外部存储中选择图像。然后,应用程序将图像保存到设备,然后将文件路径存储到sqlite数据库。然后它使用Picasso库从文件路径加载图像。我的问题是,当它从文件路径加载图像时,它加载它非常慢。保存图像后,最终显示图像可能需要一分钟。
我的问题是:保存和加载用户选择的图像的最有效方法是什么。我希望它能更快地加载图像。
这是我的代码:
获取Intent结果以供用户选择图像的方法
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
{
if(requestCode == 1)
{
try {
if (bitmap != null)
{
bitmap.recycle();
}
InputStream stream = getContentResolver().openInputStream(data.getData());
bitmap = BitmapFactory.decodeStream(stream);
stream.close();
Picasso.with(getBaseContext()).load(data.getData()).fit().centerInside().into(imageButton);
imageButton.setBackground(null);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
pictureSelected = true;
SaveImageTask saveBitmap = new SaveImageTask(bitmap);
saveBitmap.execute();
}
}
执行图片保存的异步任务
private class SaveImageTask extends AsyncTask<Void, Integer, Boolean> {
private Bitmap bitmap;
SaveImageTask(Bitmap bitmap) {
this.bitmap = bitmap;
}
@Override
protected Boolean doInBackground(Void...params) {
// Create a media file name
Calendar c = Calendar.getInstance();
String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(c.getTime());
String mImageName = "MT_"+ timeStamp +".jpg";
String albumName = "My App";
File file = null;
String state = Environment.getExternalStorageState();
// If there is external storage, save it in the pictures album. If not, save on internal storage
if(Environment.MEDIA_MOUNTED.equals(state))
{
file = new File(addEdit.this.getExternalFilesDir(
Environment.DIRECTORY_PICTURES), albumName);
if(!file.mkdirs())
{
file = new File(addEdit.this.getFilesDir(), mImageName);
}
}
else
{
file = new File(addEdit.this.getFilesDir(), mImageName);
}
OutputStream fOut = null;
try {
fOut = new FileOutputStream(file);
fOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
try {
FileOutputStream fos = new FileOutputStream(file);
filePath = file.getAbsolutePath();
Log.v("Filepath", filePath);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
return false;
}
catch(IOException e)
{
e.printStackTrace();
return false;
}
return true;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(Boolean success) {
}
}
我如何加载文件路径
if(person.getImage() != null)
{
//convert byte to bitmap take from contact class
File imgFile = new File (person.getImage());
if(imgFile.exists())
{
Picasso.with(getBaseContext()).load(imgFile).fit().centerInside().into(imageView);
}
}
任何建议都将不胜感激。谢谢。
答案 0 :(得分:1)
一个选项是以图像方式缓存图像WeakRefrence,这样你可以将图像保存在内存中,如果图像不在内存中则从sdcard加载
我认为以下链接可以帮助您