简体   繁体   中英

Crashing when I try to display a toast message, but does not crash in debugger

I have been having a LOT of memory issues with my app. I'm trying to catch the memory exceptions and then display a message using toast saying out of memory.

When I run the app with the tast code it crashes. When I run it in the debugger, does not crash but no message comes up.

I'm trying to display the message within the catch memory exception inside the onCreate method of the Activty class.

code block:

public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);


            // set size of card image
            ImageView CardImage = ( ImageView)findViewById(R.id.viewcard);
            int ScreenWidth=getWindowManager().getDefaultDisplay().getWidth();
            int ScreenHeight=getWindowManager().getDefaultDisplay().getHeight();

            // fix for tblets
            if (ScreenHeight<ScreenWidth)
               ScreenWidth=ScreenHeight;

            int CardWidth=ScreenWidth/2;
            CardWidth+=CardWidth/10;

            // set bitmap
        //    Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.card2);
            String FileName=new String("card");
            FileName+=Integer.toString( CardId+1);
            FileName+=".jpg";


            // put in text that matches card
            TextView mCardText = (TextView)findViewById(R.id.cardtext);
            mCardText.setText( "Card Meaning \n"+ cCardText.mCardMeaning[ CardId]);

            // put in text that matches card
            TextView mHouseText = (TextView)findViewById(R.id.housetext);
            mHouseText.setText( "House Meaning \n"+ cCardText.mHouseMeaning[ HouseId-1]);

        try {
       AssetManager assetManager= getAssets();
       InputStream inputStream;
       inputStream=assetManager.open(FileName);  
       Bitmap icon=BitmapFactory.decodeStream(inputStream);
       CardImage.setImageBitmap(icon);
        } catch( OutOfMemoryError e)
        {
    /////////////////////////////////////////////////////////////////////
    // crashes heare
            Context context = getApplicationContext();
            CharSequence text = "Out of Memory  ";
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.show();  

            gi++;
              return;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return;
        } 


        //scale it
        // note: only code here that pertains to card image, becouse if card image cannot be loaded
        // the above exceptions will go off and we will never get here
        CardImage.getLayoutParams().width=CardWidth;
        CardImage.getLayoutParams().height = (int)( (float) CardWidth *1.7);


    }

When you are OutOfMemory, all bets are pretty much off because at that point the JVM cannot really allocate any new memory. So it's likely crashing due to that reason.

You might want to try clearing out some pointers before displaying the message... but I've never seen anyone actually try to catch an OutOfMemory error.

The 3rd answer down here in this post Is it possible to catch out of memory exception in java? explains a bit why its a really bad idea to try to catch outofmemory exceptions.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM