2013-03-22 2 views
2

Я пытаюсь загрузить изображение из imageurl изображения, исходящего из этого url - это высокое разрешение image.it работает отлично во всех телефонах с высоким разрешением, когда я пытался загрузить это изображение в эмулятор mdpi выбрасывает исключение утечки памяти.Загрузить изображение с изображения URL-адрес для просмотра изображения

, как я могу справиться с этой ситуацией, и я хочу это изображение в каждом экране так что я объявляя растровый как глобальные переменную

есть ли способ уменьшить размер изображения во время загрузки. IAM, используя код, приведенный ниже, чтобы загрузить изображение

c1 является ссылкой на просмотр изображения

bitmap = BitmapFactory.decodeStream((InputStream)new URL(logourltop.get(0)).getContent()); 
cl.setImageBitmap(bitmap) ; 

(или)

лучше использовать urlimagehelper проект, чтобы загрузить изображение, когда требуется

UrlImageViewHelper.setUrlDrawable(cl,logourltop.get(0)); 

и еще одно сомнение - я меняю виды в той же деятельности, используя

setContentView(R.layout.filename). 

если я изменить вид на ListItem нажмите память, выделенную для растрового изображения будет выпущены или нет. (Памяти, выделенных для объектов и растровых изображений для этой точки зрения)

пожалуйста, вы можете предложить мне лучший способ избегайте утечек памяти.

ответ

0
import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.net.URL; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ImageView; 

public class downloadimg extends Activity { 

// 
private ImageView mImageView; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //Find the reference to the ImageView 
    mImageView = (ImageView) findViewById(R.id.test_image); 

    // You can set a temporary background here 
    //image.setImageResource(null); 

    // Start the DownloadImage task with the given url 
    new DownloadImage().execute("http://demo.imgur.com/CQzlM.jpg"); 
} 


/** 
* Simple functin to set a Drawable to the image View 
* @param drawable 
*/ 
private void setImage(Drawable drawable) 
{ 
    mImageView.setBackgroundDrawable(drawable); 
} 

public class DownloadImage extends AsyncTask<String, Integer, Drawable> { 

    @Override 
    protected Drawable doInBackground(String... arg0) { 
     // This is done in a background thread 
     return downloadImage(arg0[0]); 
    } 

    /** 
    * Called after the image has been downloaded 
    * -> this calls a function on the main thread again 
    */ 
    protected void onPostExecute(Drawable image) 
    { 
     setImage(image); 
    } 


    /** 
    * Actually download the Image from the _url 
    * @param _url 
    * @return 
    */ 
    private Drawable downloadImage(String _url) 
    { 
     //Prepare to download image 
     URL url;   
     BufferedOutputStream out; 
     InputStream in; 
     BufferedInputStream buf; 

     //BufferedInputStream buf; 
     try { 
      url = new URL(_url); 
      in = url.openStream(); 



      // Read the inputstream 
      buf = new BufferedInputStream(in); 

      // Convert the BufferedInputStream to a Bitmap 
      Bitmap bMap = BitmapFactory.decodeStream(buf); 
      if (in != null) { 
       in.close(); 
      } 
      if (buf != null) { 
       buf.close(); 
      } 

      return new BitmapDrawable(bMap); 

     } catch (Exception e) { 
      Log.e("Error reading file", e.toString()); 
     } 

     return null; 
    } 

} 

} 
+0

-1 для кода только ответ – WarrenFaith

+1

код не закрывают ресурсы безопасно ... закрыть ресурсы окончательно заблокировать. –

1

Вы в основном должны загрузить данные изображения и данные изображения в виде потока или массива байтов, вы можете использовать удобные методы из BitmapFactory, которые дадут вам Bitmap из него, и с этот битмап в руках, вы уже можете установить его непосредственно в ImageView.

Убедитесь, что вы выполняете загрузку из сети в отдельной теме, например. используя AsyncTask .doInBackground() и установить растровое изображение в ImageView в потоке пользовательского интерфейса, например. установив его на метод onPostExecute() AsyncTask или вызывающий Activity.runOnUIThread().

+0

, но если растровое изображение имеет изображение с высоким разрешением, я получаю сообщение об ошибке утечки памяти. Как изменить размер изображения, связанного с кучей устройства. –

+0

Вот почему они изобрели BitampFactory.Options: https://developer.android.com/reference/android/ графика/BitmapFactory.Options.html играйте с ним, чтобы найти наилучший вариант. В BitmapFactory вы передаете массив байтов или поток для получения растрового изображения, вы можете предоставить объект Options в качестве параметра, который будет применяться для предотвращения ошибок в памяти ... в этом случае вы определенно хотите работать с потоками, а не с байтовыми массивами , –

+0

все-таки это работало? –

-1

Надеется, что это поможет ...

public class BitmapResizer { 

    public static Bitmap decodeFile(File f,int requiredSize){ 
    try { 
     //decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

     //Find the correct scale value. It should be the power of 2. 
     final int REQUIRED_SIZE=requiredSize; 
     int width_tmp=o.outWidth, height_tmp=o.outHeight; 
     int scale=1; 
     while(true){ 
      if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) 
       break; 
      width_tmp/=2; 
      height_tmp/=2; 
      scale*=2; 
     } 

     //decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize=scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) { 

    } 
    return null; 
}} 
+0

следующий код только ответ и следующий голос голосования ... «надеюсь, это поможет ...» – WarrenFaith

+0

Пользователь только хочет получить ответ [email protected] WarrenFaith –

+0

и все остальные, которые ищут ответы, просто хотят скопировать и вставить код, не изучая ничего ... true true, поддерживайте ленивый один раз ... – WarrenFaith

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