On Sat, Mar 7, 2009 at 7:49 PM, clark <[email protected]> wrote: > >> BTW, the Android engineer who wrote the throwIfRecycled method should >> be lynched. I understand that it saves an "if", as in: > > Lynched??? Really. Wow, that would be a little excessive, don't you > think? I understand your frustration with the implementation of the > throwIfRecylced method, but to say the engineer should be lynched is > just ridiculous. Perhaps stopping to read your post prior to hitting > "send" would not be a bad idea. I think there are more tactful ways > of addressing issues than to attack the google developers. An OS and > the accompanying Framework are no small project, and I think most of > us realized there would be issues along the way, especially with the > hardware being released with a 1.0 SDK.
You can't possibly think that I *meant* that the guy should be lynched, right? It's an expression of frustration. If an engineer were lynched for 1 bug there wouldn't be any of us :) It's not that I don't understand what an enormous effort an OS and a framework is, my frustration comes from the fact that Google have published performance guidelines for app developers but in this case (which btw is quite a hot spot if you're developing a game and most of the app's time is spent in drawing) they've chosen a shortcut and instead of doing a direct check are calling a method (throwIfRecycled), which in turns calls another method (isRecycled) and could easily spare both calls (or at least one): 1. throwIfRecycled is absolutely not needed - they can call isRecycled directly in an if statement in drawBitmap 2. isRecycled is not needed as well. To answer Romain's post - drawBitmap_native or whatever the JNI method is called could check whether the bitmap is recycled or not, and surely faster than Java would (i.e. checking a bit or comparing against an invalid handle value or whatever the native implementation uses). > > Long story short, be careful not to bite off the hand that feeds you. > Okay google isn't feeding you, but they have produced something that > has great potential, and as a community we need to come together and > help out in any which way we can. So I can't criticize if they've done something wrong, huh? I know I'm probably the grumpiest ranting dev on the list but I just can help it when I see something as obviously wrong as that. > > And as JBQ said, if you have a better implementation send it on up to > the google guys to review and possibly implement. Well, it's not that I'm suggesting they implement drawBitmap in some fundamentally different and optimized way, is it? It's just replacing 2 method calls with 1 "if" and a method call. > > > ~clark > > On Mar 7, 8:49 am, Stoyan Damov <[email protected]> wrote: >> BTW, the Android engineer who wrote the throwIfRecycled method should >> be lynched. I understand that it saves an "if", as in: >> >> if (bitmap.isRecycled()) throw ... >> >> but s/he didn't even implement it defensively enough and the method >> crashes if passed a null pointer. >> >> Now, you either make the method super safe so it checks for both a >> null pointer and whether the bitmap is recycled, or you let the user's >> code crash miserably (preferred). >> I will *very* much appreciate a Canvas::drawBitmapFast() or >> drawBitmapUnsafe() method which doesn't check anything, because the >> current implementation of drawBitmap(Bitmap, Paint) spends as much as >> 9%!!!!! in throwIfRecycled, which IMVHO is unacceptable. >> >> Cheers >> >> On Sat, Mar 7, 2009 at 6:37 PM, Marco Nelissen <[email protected]> wrote: >> >> > On Fri, Mar 6, 2009 at 5:59 AM, William <[email protected]> wrote: >> >> >> I am drawing bitmaps left and right and I hit this issue where I >> >> create a bitmap in one section of my code and when I later try to draw >> >> on it using canvas, i get bitmap recycled. but I did not null if out, >> >> or call its recycle method. >> >> >> Description: >> >> >> I have a main Class that extends View that when first loads, initiates >> >> the main screen which loads/draws on bitmaps and no problem. I then >> >> added a key event that causes this screen to go away and load the next >> >> screen. The screen logic is encapsulated in a class that I already >> >> instantiated in the Main Class constructor and in my second screen its >> >> constructor is this code: >> >> >> staticBg = new BitmapDrawable(Bitmap.createBitmap(320, 240, >> >> Bitmap.Config.RGB_565)); >> >> staticGr = new Canvas( staticBg.getBitmap() ); >> >> >> at a later time, from my first screen when I push a button, i call my >> >> init() function that trys load screen two which does a draw to this >> >> bitmap and I get the following error: >> >> >> 03-06 08:52:56.301: ERROR/AndroidRuntime(846): >> >> java.lang.NullPointerException >> >> 03-06 08:52:56.301: ERROR/AndroidRuntime(846): at >> >> android.graphics.Canvas.throwIfRecycled(Canvas.java:890) >> >> 03-06 08:52:56.301: ERROR/AndroidRuntime(846): at >> >> android.graphics.Canvas.drawBitmap(Canvas.java:911) >> >> >> It is saying my bitmap is recycled BUT from what I understand that >> >> does not happened unless you explicitly call it or the garbage >> >> collector does when there are no more references to it BUT i obviously >> >> still have a reference to it. What am I doing wrong? >> >> > Are you sure it's your bitmaps it's complaining about, and not some >> > other bitmap? >> > Are you using the drawing cache in any way? > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---

