Nuno Sarmento
Nuno Sarmento

Reputation: 427

java.lang.OutOfMemoryError Pictures

I'm trying to fetch the pictures from a feed and I'm getting this error can any one help me with this one please .

Error:

java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:696)
at com.ultrait.cobat.FindPropertyActivity.DownloadImage(FindPropertyActivity.java:140)
at com.ultrait.cobat._09_LatestDetailed$7.run(_09_LatestDetailed.java:262)
at java.lang.Thread.run(Thread.java:841)

My Code:

<!--  public class _06_Photos extends Activity implements ViewFactory {

private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;


//GUI  Components
TextView tv_counter;
ImageSwitcher imageSwitcher;

Button b_play;
Button b_next;
Button b_previous;
Button b_more;

FrameLayout topFrame, bottomFrame;

//Images and Stuff
String [] str_imageURLs;
Bitmap [] bm_images;
String propertyid;
int picNum = 0;
boolean play;
boolean stop;
Handler handler;

Thread playThread;


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.xl_06_photos);

    handler = new Handler();
    propertyid = "";
    playThread = new Thread(Play);

    play = false;
    stop = false;
    playThread.start();


    str_imageURLs = new String[10];
    for(int i=0; i<10;++i)
        str_imageURLs[i] = "";

    bm_images = new Bitmap[10];
    for(int i=0; i<10;++i)
        bm_images[i] = BitmapFactory.decodeResource(getResources(), R.drawable.downloading);

    InitView();

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        str_imageURLs[0] = extras.getString("img1");
        str_imageURLs[1] = extras.getString("img2");
        str_imageURLs[2] = extras.getString("img3");
        str_imageURLs[3] = extras.getString("img4");
        str_imageURLs[4] = extras.getString("img5");
        str_imageURLs[5] = extras.getString("img6");
        str_imageURLs[6] = extras.getString("img7");
        str_imageURLs[7] = extras.getString("img8");
        str_imageURLs[8] = extras.getString("img9");
        str_imageURLs[9] = extras.getString("img10");
    }

    for(int i=0; i<9; i++)
        System.out.println(str_imageURLs[i]);



    new Thread(new Runnable() {
        public void run() {
            for(int i=0; i<9; ++i)
            {
                try{
                    bm_images[i] = FindPropertyActivity.DownloadImage(str_imageURLs[i]);
                }
                catch(Exception e){
                    System.out.println("Image" + i + " not downloaded - " + e);
                }

                try{
                    if(bm_images[i] == null){
                        System.out.println("Bitmap " + i + " is null");
                        bm_images[i] = BitmapFactory.decodeResource(getResources(), R.drawable.download_error);
                    }

                    if(picNum == i)
                        handler.post(SetPic);
                }
                catch(Exception e){
                    System.out.println("PicNum null/visiablity" + i + " not setCorrectly - " + e);
                }
            }
            System.gc();
        }
    }).start();
}

private void InitView(){

    handler.post(SetPic);
    tv_counter = (TextView)findViewById(R.id.photo_tv_counter);
    imageSwitcher = (ImageSwitcher)findViewById(R.id.photo_imageSwitcher);
    imageSwitcher.setFactory(this);

    topFrame = (FrameLayout)findViewById(R.id.photo_topFrame);
    bottomFrame = (FrameLayout)findViewById(R.id.photo_bottomFrame);

    final GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector());
    imageSwitcher.setOnTouchListener(new View.OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            gestureDetector.onTouchEvent(event);
            return true;
        }
    });


    b_play = (Button)findViewById(R.id.photo_b_play);
    if(play){   
        b_play.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_pause));
        topFrame.setVisibility(View.INVISIBLE);
        bottomFrame.setVisibility(View.INVISIBLE);
    }
    else{
        b_play.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_play)); 

    }
    b_play.setOnTouchListener(new View.OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                Drawable background =  v.getBackground();
                background.setColorFilter(0xFF7A7A7A, PorterDuff.Mode.MULTIPLY);
                v.setBackgroundDrawable(background);
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                Drawable background =  v.getBackground();
                background.setColorFilter(null);
                v.setBackgroundDrawable(background);

                if(play){
                    play = false;
                    b_play.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_play));
                }

                else{
                    play = true;
                    b_play.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_pause));
                    topFrame.setVisibility(View.INVISIBLE);
                    bottomFrame.setVisibility(View.INVISIBLE);
                }   
            }
            return false;
        }
    });



    b_previous = (Button)findViewById(R.id.photo_b_previous);
    b_previous.setOnTouchListener(new View.OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                Drawable background =  v.getBackground();
                background.setColorFilter(0xFF7A7A7A, PorterDuff.Mode.MULTIPLY);
                v.setBackgroundDrawable(background);
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                Drawable background =  v.getBackground();
                background.setColorFilter(null);
                v.setBackgroundDrawable(background);

                PreviousPic();
            }
            return false;
        }
    });

    b_next = (Button)findViewById(R.id.photo_b_next);
    b_next.setOnTouchListener(new View.OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                Drawable background =  v.getBackground();
                background.setColorFilter(0xFF7A7A7A, PorterDuff.Mode.MULTIPLY);
                v.setBackgroundDrawable(background);
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                Drawable background =  v.getBackground();
                background.setColorFilter(null);
                v.setBackgroundDrawable(background);

                NextPic();
            }
            return false;
        }
    });


}

public void onDestroy(){
    super.onDestroy();
    stop = true;
}

private final Runnable SetPic = new Runnable() {
    public void run() {
        //iv_activity.setVisibility(View.INVISIBLE);
        Drawable d =new BitmapDrawable(bm_images[picNum]);
        imageSwitcher.setImageDrawable(d);
        System.out.println("Pic Set");

        tv_counter.setText("" + (picNum+1) + "/5");
    }
};

private final Runnable Play = new Runnable() {
    public void run() {
        while(!stop){
            try{
                Thread.sleep(3000);
                handler.post(new Runnable() {
                    public void run() {
                        if(play)
                            NextPic();
                    }
                });
            }
            catch(Exception e){
                System.out.println("Play Error - " + e);
            }
        }
    }
};


protected void NextPic(){

    try{
        picNum++;
        if(picNum > 9)
            picNum = 0;

        tv_counter.setText("" + (picNum+1) + "/10");

        imageSwitcher.setInAnimation(this, R.anim.slide_in_left ); // added
        imageSwitcher.setOutAnimation(this, R.anim.slide_out_left); // added
        Drawable d =new BitmapDrawable(bm_images[picNum]);
        imageSwitcher.setImageDrawable(d);
        System.out.println("Next Pic");
    }
    catch(Exception e){
        System.out.println("Next Fail " + e);
        //imageSwitcher.setImageResource(R.drawable.download_error);
        imageSwitcher.setImageDrawable(null);
    }
}

protected void PreviousPic(){


        picNum--;
        if(picNum < 0)
            picNum = 9;

        tv_counter.setText("" + (picNum+1) + "/10");
    try{    
        imageSwitcher.setInAnimation(this, R.anim.slide_in_right ); // added
        imageSwitcher.setOutAnimation(this, R.anim.slide_out_right); // added
        Drawable d =new BitmapDrawable(bm_images[picNum]);
        imageSwitcher.setImageDrawable(d);
        System.out.println("Previous Pic");
    }
    catch(Exception e){
        System.out.println("Previous Fail " + e);
        //imageSwitcher.setImageResource(R.drawable.download_error);
        imageSwitcher.setImageDrawable(null);
    }

}
protected void ChangeBarVisibles(){
    if(topFrame.isShown()){
        topFrame.setVisibility(View.INVISIBLE);
        bottomFrame.setVisibility(View.INVISIBLE);
    }
    else{
        topFrame.setVisibility(View.VISIBLE);
        bottomFrame.setVisibility(View.VISIBLE);
    }
}


public View makeView() 
{
    ImageView imageView = new ImageView(this);
    imageView.setBackgroundColor(0xFF000000);
    imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
    imageView.setLayoutParams(new 
            ImageSwitcher.LayoutParams(
                    LayoutParams.FILL_PARENT,
                    LayoutParams.FILL_PARENT));
    return imageView;
}

class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        try {

            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return false;
            // right to left swipe
            if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
               //Toast.makeText(SelectFilterActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
               NextPic();
               //return true;
           }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
               //Toast.makeText(SelectFilterActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
            PreviousPic();
            //return true;
           }    
       } catch (Exception e) {
           // nothing
       }
       return true;
   }

   public boolean onSingleTapUp(MotionEvent e){
       if(e.getAction() == MotionEvent.ACTION_UP){
            ChangeBarVisibles();
       }
       return true;
    }
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.xl_06_photos);

  InitView();
}

} -->

FindPropertyActivity:

//Public static method to download images from the internet

public static Bitmap DownloadImage(String URL){

    Bitmap bmImg = null;
    URL myFileUrl =null;

    try {
        myFileUrl= new URL(URL);
    } catch (Exception e) {
        //e.printStackTrace();
        System.out.println(e);
    }
    try {
        HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
        conn.setDoInput(true);
        conn.connect();
        InputStream is = conn.getInputStream();
        bmImg = BitmapFactory.decodeStream(is);
    }
    catch(Exception e){
        System.out.println(e);
    }
    return bmImg;
}

public static Bitmap DownloadImage2(String URL){

    Bitmap bmImg = null;
    URL myFileUrl =null;

    try {
        myFileUrl= new URL(URL);
    } catch (Exception e) {
        //e.printStackTrace();
        System.out.println(e);
    }
    try {
        HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
        conn.setDoInput(true);
        conn.connect();
        InputStream is = conn.getInputStream();
        BitmapFactory.Options options=new BitmapFactory.Options();
        options.inSampleSize = 7;
        bmImg=BitmapFactory.decodeStream(is,null,options);
        //bmImg = BitmapFactory.decodeStream(is);

    }
    catch(Exception e){
        System.out.println(e);
    }
    return bmImg;
}

Upvotes: 1

Views: 1509

Answers (3)

Hiemanshu Sharma
Hiemanshu Sharma

Reputation: 7862

Bitmaps really use a lot of RAM and OOM is pretty common with those. Along with all the above suggested solutions, you should add android:largeHeap="true" inside your tag in AndroidManifest.xml. With this tag Android gives your application a little more RAM and fixes some of the most common issues. This is a workaround and not the best solution, the better option would be to ofcourse fix the implementation if possible.

Upvotes: 1

koni
koni

Reputation: 1795

Personally I use the Picasso Library from Jake Wharton. Its a good way to load in one line your image and manage caching, transformations, download etc..

Here is the link to download the library: http://square.github.io/picasso/

All the code you need is :

Picasso.with(context).load("http://yourimage.jpg").into(yourImageView);

you should try it and I hope it helps you :)

Upvotes: 0

humblerookie
humblerookie

Reputation: 4947

The image you're decoding must be a heavy one. Typically this error is thrown when bitmaps are decoded into the memory while carelessly ignoring their size. You would be required to specify the bitmap options (decode parameters height ,width etc) while decoding.

Kindly find the solution. http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Upvotes: 0

Related Questions