2016-01-10 2 views
0
public static Bitmap getBitmapFromURL(String src) { 
     try { 
      URL url = new URL(src); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      Bitmap myBitmap = BitmapFactory.decodeStream(input); 
      return myBitmap; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    private class AsyncImageLoader extends AsyncTask<String, Void, Bitmap[]> { 
     Bitmap bitmap[]; 

     protected void onPreExecute() { 
      pDialog.setMessage(getContext().getResources().getString(R.string.please_wait)); 
      showDialog(); 
     } 

     @Override 
     protected Bitmap[] doInBackground(String... params) { 
      hideDialog(); 
      bitmap = new Bitmap[2]; 
      bitmap[0] = getBitmapFromURL(params[0]); 
      bitmap[1] = getBitmapFromURL(params[1]); 

      return bitmap; 
     } 

     @Override 
     protected void onPostExecute(Bitmap[] bm) { 
      imgCover.setImageBitmap(bm[1]); 
      bm[1].recycle(); 
      imgProfile.setImageBitmap(bm[0]); 
      bm[0].recycle(); 
      if (MainActivity.PROFILE_UID.equals(MainActivity.USER_UID)) 
       FragmentDrawer.imgProfileNavDrawer.setImageBitmap(bm[0]); // Sol drawer' da çıkan yuvarlak resmi güncellemek için 
     } 
    } 

01-10 21: 11: 14,621 7906-8194/project.com.holobech Е/AndroidRuntime: неустранимый: AsyncTask # 2 java.lang.RuntimeException: Произошла ошибка при выполнении doInBackground() на android.os.AsyncTask $ 3.done (AsyncTask.java:299) на java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:352) на java.util.concurrent .FutureTask.setException (FutureTask.java:219) на java.util.concurrent.FutureTask.run (FutureTask.java:239) на android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:230) на java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1080) на java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:573) на java.lang.Thread.run (Thread. Java: 856) Вызванный: java.lang.OutOfMemoryError на android.graphics.BitmapFactory.nativeDecodeStream (нативный метод) на android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:528) на android.graphics.BitmapFactory. decodeStream (BitmapFactory.java:600) на project.com.holobech.activity.ProfileFragment.getBitmapFromURL (ProfileFragment.java:508) на project.com.holobech.activity.ProfileFragment $ AsyncImageLoader.doInBackground (ProfileFragment.java:529) на project.com.holobec h.activity.ProfileFragment $ AsyncImageLoader.doInBackground (ProfileFragment.java:516) на android.os.AsyncTask $ 2.call (AsyncTask.java:287) на java.util.concurrent.FutureTask.run (FutureTask.java:234) на android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:230) на java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1080) на java.util.concurrent.ThreadPoolExecutor $ Worker. бег (ThreadPoolExecutor.java:573) на java.lang.Thread.run (Thread.java:856)AsyncTask # 2 java.lang.RuntimeException

Он работает идеально подходит для Android 5.0 и более поздних версий. Но когда я пытаюсь с версией 4.2.2, эта ошибка возникает. Как я могу исправить эту проблему? Спасибо за консультацию

+0

Похоже на ошибку в памяти этого логарифма, что может объяснить, почему вы получаете разные результаты на разных устройствах/API Android. – NameSpace

+0

Я обрабатываю ошибку памяти, но первая ошибка все еще происходит –

ответ

2

Это очень распространенная ошибка, когда вы имеете дело с растровым изображением. Преобразование растрового изображения непосредственно из URL-адреса не является хорошей практикой. Вы должны использовать bitmap BitmapFactory.Options, предоставляемый андроидом, с помощью которого вы можете получить размер растрового изображения, даже не создавая растровое изображение. Теперь вам нужно использовать опрыскивание параметров BitmapFactory и изменить размер изображений. Я предполагаю, что размер и качество изображения слишком высоки, и именно поэтому, когда вы конвертируете его в растровое изображение, это избавляет вас от памяти. Каждое приложение для Android имеет максимальную 50 мб ОЗУ для использования, когда оно выходит за пределы этого ограничения. Система Android выделяет исключение из памяти. Однако мы можем управлять им, сделав запись атрибута в манифесте в теге приложения largeHeap равным true.

Лучшая практика обработки растровых изображений android доступна на сайте разработчика. Вы можете нажать here

Примечание: - функция largeHeap будет работать только с OS 3.0 и выше.

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