У меня есть приложение, в котором пользователь выбирает изображение из облака, внутреннего хранилища или внешнего хранилища. Затем приложение сохраняет изображение на устройство, а затем сохраняет путь к базе данных sqlite. Затем он использует библиотеку Picasso для загрузки изображения из пути к файлу. Моя проблема заключается в том, что когда он загружает изображение из пути к файлу, он загружает его очень медленно. После сохранения изображения потребуется, может быть, минута, чтобы отобразить его.Android, что является самым эффективным способом сохранения и загрузки изображений?
Мой вопрос: что является самым эффективным способом сохранения и загрузки изображений, выбранных пользователем. Я бы хотел, чтобы он быстрее загружал изображения.
Вот мой код:
метод, который получает результат от 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);
}
}
Любые советы были бы весьма полезными. Спасибо.
Просто интересно, почему вы хотите сохранить его в локальной памяти? – Sharj
Я просто хочу хранить его в любом месте устройства, чтобы я мог легко получить к нему доступ позже. Пользователь сохраняет изображение как «изображение профиля». Я просто спрашиваю, как сделать это более эффективно, поэтому, если хранить его в локальной памяти неэффективно, я пытаюсь найти лучшую альтернативу. @Sharj – Sloganho
http://www.captechconsulting.com/blog/raymond-robinson/google-io-2013-volley-image-cache-tutorial –