2015-01-15 2 views
1

У меня есть приложение, в котором пользователь выбирает изображение из облака, внутреннего хранилища или внешнего хранилища. Затем приложение сохраняет изображение на устройство, а затем сохраняет путь к базе данных 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); 
     } 
    } 

Любые советы были бы весьма полезными. Спасибо.

+0

Просто интересно, почему вы хотите сохранить его в локальной памяти? – Sharj

+0

Я просто хочу хранить его в любом месте устройства, чтобы я мог легко получить к нему доступ позже. Пользователь сохраняет изображение как «изображение профиля». Я просто спрашиваю, как сделать это более эффективно, поэтому, если хранить его в локальной памяти неэффективно, я пытаюсь найти лучшую альтернативу. @Sharj – Sloganho

+0

http://www.captechconsulting.com/blog/raymond-robinson/google-io-2013-volley-image-cache-tutorial –

ответ

1

один вариант был бы кэш изображения Копания WeakRefrence таким образом вы можете сохранить изображение в памяти, и если изображение не в памяти, то загрузить из SDCard

я думаю, что ниже ссылки могут помочь вам

weakReference и другие weak reference for cache

+0

В соответствии с сайтом android.devlopers, это не рекомендуется ». Примечание. Раньше популярной реализацией кэша памяти был кеш-память SoftReference или WeakReference, но это не рекомендуется. Начиная с Android 2.3 (API Level 9) мусор сборщик более агрессивен, собирая мягкие/слабые ссылки, что делает их довольно неэффективными. Кроме того, до Android 3.0 (уровень API 11) данные поддержки растрового изображения были сохранены в собственной памяти, которая не была выпущена предсказуемым образом, потенциально заставляя приложение в кратчайшие сроки превышать его пределы памяти и сбоя." – Sloganho

+0

см. [Ссылка] (http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html) – Sloganho

Смежные вопросы