1

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_LatestDetailed7ドル.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;
}
asked Jul 7, 2014 at 10:13
3
  • There is OpenSL bound that phone can rendering. Try to check it. final int[] maxSize = new int[1]; GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSize, 0); and scale your image after it if needed Commented Jul 7, 2014 at 10:15
  • Try Android Universal Image Loader, this will help for loading and caching image and avoid OOM error. Hope it can help. Commented Jul 7, 2014 at 10:22
  • Well I can try, but it doesn't make any sense it only crashes on 4.3 all lowers versions works without any problem Commented Jul 7, 2014 at 10:31

3 Answers 3

1

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.

answered Jul 7, 2014 at 10:37
Sign up to request clarification or add additional context in comments.

4 Comments

Thank you for your fast response, I will try to do that now. Only thing puzzle me is this is working on lowest versions 4.0.3 and so on , only crashes on 4.3 upwards .
I've had similar experiences with Bitmap, this was the only thing that worked for me. On a device with 4.2.2 it was only using around 30mb, but with an S4 on 4.4.4 it was using close to 120mb, and on a nexus 5 it was around 110. I still don't understand what is the reason for this, but for now it works for me.
This method has work in a different issue I had in a different app. thank you very much for you help
in android 4.4.2 this makes a crash with loading image into memory. largeHeap solved the issue. thank you
0

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

answered Jul 7, 2014 at 10:23

8 Comments

It works on 4.2 , 4.0 and so on . It only crashes on 4.3 and 4.4 . Any Ideas ?
It doesn't seem to be an OS issue.Please post the FindPropertyActivity class which I suppose downloads and decodes the image from the disk.
Thank you humblerookie for you fast response , I will do it now.
I have post part of it
Any lucky humblerookie?
|
0

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 :)

answered Jul 7, 2014 at 10:27

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.