This is a placeholder post.
When the reason for this post goes live, this post will be updated with all that you need to know. There is probably a better way to do this. At that time, comments will be turned on, too. ;)
My Blog List
Diberdayakan oleh Blogger.
Senin, 09 Mei 2011
Jumat, 04 Maret 2011
Reader Feedback: Analysis of an Exercise
At the end of each "Hour" in the Sam's Teach Yourself Android Application Development in 24 Hours
book, there are exercises. We originally designed these exercises to be items people could try to extend their knowledge above and beyond what was learned verbatim in the chapter, given some hints and practice using the the Android documentation that is critical to become familiar with.
Here we present one such exercise that occurs in one of the first real coding hours and present our thought process for determining the solution. Hopefully this will help readers who may be struggling with the difficulty of the exercises. That said, we have also determined, based upon reader feedback, that a handful of exercises in the book are perhaps unfairly difficult. For the next edition of the book, many of these will be replaced or labelled as challenge exercises.
Walk-Through of an Exercise
This is from Hour 7 on page 125, if you'd like to follow along. As it's the end of the chapter, you already would have downloaded the code to work along with in the chapter. If not, it's available right here.
Thought Process, Step 1: This tells me we're dealing with something to do with the LayoutAnimationController. Luckily, we just covered that on page 122, where we gave this following code:
Thought Process, Step 2: The code goes in QuizSplashActivity. Since I'm in Hour 7, I've been implementing this activity for the Splash Screen for most of the chapter.
Key Phrase #2: "to apply animations of each child view within a TableRow control"
Thought Process, Step 3: So far so good. The code is already doing that. We found the code in the section labelled, "Animating All Views in a Layout."
Key Phrase #3: "in random order"
Thought Process, Step 4: Hmm, I don't know how to do that. Let me read on, finishing the sentence...
Key Phrase #4: "using the setOrder() method with a value of 2 (random)."
Thought Process, Step 5: Oh, that's how! OK, hold on. I have two options: I could look up this method in the Android SDK docs, or just write it based on what was said in the exercise and see what happens. (Note: We prefer you look it up, like a good student, but experimentation doesn't hurt anything, either.) But perhaps we're lazy so... Let me just add that one line of code to the end of the initial listing, which will now look like:
Run the app and see what happens.... Hey! That's pretty neat. Each time I run it, the animations happen in a different order and sometimes some of them happen at the same time.
Here we present one such exercise that occurs in one of the first real coding hours and present our thought process for determining the solution. Hopefully this will help readers who may be struggling with the difficulty of the exercises. That said, we have also determined, based upon reader feedback, that a handful of exercises in the book are perhaps unfairly difficult. For the next edition of the book, many of these will be replaced or labelled as challenge exercises.
Walk-Through of an Exercise
This is from Hour 7 on page 125, if you'd like to follow along. As it's the end of the chapter, you already would have downloaded the code to work along with in the chapter. If not, it's available right here.
"Exercise #1: Modify the LayoutAnimationController in the QuizSplashActivity class to apply animations of each child view within a TableRow control in random order by using the setOrder() method with a value of 2 (random)."Key Phrase #1: "Modify the LayoutAnimationController in the QuizSplashActivity"
Thought Process, Step 1: This tells me we're dealing with something to do with the LayoutAnimationController. Luckily, we just covered that on page 122, where we gave this following code:
Animation spinin = AnimationUtils.loadAnimation(this, R.anim.custom_anim);
LayoutAnimationController controller = new LayoutAnimationController(spinin);
TableLayout table = (TableLayout) findViewById(R.id.TableLayout01);
for (int i = 0; i < table.getChildCount(); i++) {
TableRow row = (TableRow) table.getChildAt(i);
row.setLayoutAnimation(controller);
}
Thought Process, Step 2: The code goes in QuizSplashActivity. Since I'm in Hour 7, I've been implementing this activity for the Splash Screen for most of the chapter.
Key Phrase #2: "to apply animations of each child view within a TableRow control"
Thought Process, Step 3: So far so good. The code is already doing that. We found the code in the section labelled, "Animating All Views in a Layout."
Key Phrase #3: "in random order"
Thought Process, Step 4: Hmm, I don't know how to do that. Let me read on, finishing the sentence...
Key Phrase #4: "using the setOrder() method with a value of 2 (random)."
Thought Process, Step 5: Oh, that's how! OK, hold on. I have two options: I could look up this method in the Android SDK docs, or just write it based on what was said in the exercise and see what happens. (Note: We prefer you look it up, like a good student, but experimentation doesn't hurt anything, either.) But perhaps we're lazy so... Let me just add that one line of code to the end of the initial listing, which will now look like:
Animation spinin = AnimationUtils.loadAnimation(this, R.anim.custom_anim);
LayoutAnimationController controller = new LayoutAnimationController(spinin);
TableLayout table = (TableLayout) findViewById(R.id.TableLayout01);
for (int i = 0; i < table.getChildCount(); i++) {
TableRow row = (TableRow) table.getChildAt(i);
row.setLayoutAnimation(controller);
}
controller.setOrder(2); // THIS IS THE ONE NEW LINE OF CODE, THE SOLUTION TO EXERCISE #1
Run the app and see what happens.... Hey! That's pretty neat. Each time I run it, the animations happen in a different order and sometimes some of them happen at the same time.
Rabu, 02 Maret 2011
Tip: Speeding Up Your Android Emulator Launch
The latest version of the Android emulator comes with a feature called "snapshots." It needs to be enabled as a feature of each AVD. Luckily, this version also includes the ability to edit existing AVDs.
First, enable the feature:
Second, when launching the AVD, choose to load from the snapshot and save the snapshot. When a snapshot isn't found, the AVD boots up from scratch. As we all know, this takes quite a long time even on very fast machines.
Now, when you exit, the system will store off a snapshot of the state of the AVD. This takes a little while, depending on how much RAM is assigned to the AVD. After saving the state once, the AVD will now launch very quickly - usually in just a couple of seconds.
However, the exit is no longer super speedy and often triggers "Not Responding" type messages. If you always want to return to exactly where you left off, this is how it will work. Overall, the behavior is much faster. However, if you want it to come up clean each time, just make sure the first time you boot it's clean, then exit to save the snapshot. Now, when you launch the AVD, only check load from snapshot, but make sure save to snapshot is unchecked.
Now, the system will just load the AVD from the one snapshot you created and not save the state each time you exit. This means super speedy launches into a cleanly booted emulator as well as super speedy exits since the snapshot doesn't have to be saved each time.
You'll start to feel like you don't need to keep the emulators running all the time. You also won't necessarily go looking for a phone each time just to save the emulator boot-up time. (You'll still go after the phone or tablet when debugging for performance or with code bases that are otherwise slow on the emulator or other such reasons.)
How much difference does it actually make? Here are some test results running on a 6 core 3 GHz desktop with 8GB of RAM and a relatively speedy SSD:
That cuts the emulator launch time by 97%. Put another way, the cold launch takes 34 times longer. Taking these steps is well worth the minimal additional effort.
Happy Android Coding!
First, enable the feature:
![]() |
| Enabling Snapshots |
Second, when launching the AVD, choose to load from the snapshot and save the snapshot. When a snapshot isn't found, the AVD boots up from scratch. As we all know, this takes quite a long time even on very fast machines.
![]() |
| Enable Snapshot options |
Now, when you exit, the system will store off a snapshot of the state of the AVD. This takes a little while, depending on how much RAM is assigned to the AVD. After saving the state once, the AVD will now launch very quickly - usually in just a couple of seconds.
However, the exit is no longer super speedy and often triggers "Not Responding" type messages. If you always want to return to exactly where you left off, this is how it will work. Overall, the behavior is much faster. However, if you want it to come up clean each time, just make sure the first time you boot it's clean, then exit to save the snapshot. Now, when you launch the AVD, only check load from snapshot, but make sure save to snapshot is unchecked.
![]() |
| Don't save over old snapshot |
Now, the system will just load the AVD from the one snapshot you created and not save the state each time you exit. This means super speedy launches into a cleanly booted emulator as well as super speedy exits since the snapshot doesn't have to be saved each time.
You'll start to feel like you don't need to keep the emulators running all the time. You also won't necessarily go looking for a phone each time just to save the emulator boot-up time. (You'll still go after the phone or tablet when debugging for performance or with code bases that are otherwise slow on the emulator or other such reasons.)
How much difference does it actually make? Here are some test results running on a 6 core 3 GHz desktop with 8GB of RAM and a relatively speedy SSD:
- Cold launch of Android 3.0 emulator to a usable state: 4 minutes 35 seconds
- Snapshop launch of same Android 3.0 AVD: 8 seconds
That cuts the emulator launch time by 97%. Put another way, the cold launch takes 34 times longer. Taking these steps is well worth the minimal additional effort.
Happy Android Coding!
Label:
android,
Android Virtual Device,
AVD,
development,
emulator,
snapshot,
tips
Senin, 28 Februari 2011
Tip: Installed Application Not Installed Error
Have you ever loaded up an application, ready to debug, but then seen a message along the lines of, "Application Not Installed" display? This usually has an accompanying LogCat error:
ActivityManager: java.lang.SecurityException: Permission Denial: starting IntentThe cause and solution are very simple:
- This error is most likely caused by a duplicate Activity class entry in the manifest file.
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- lots of stuff -->
<activity
android:name="MainActivity"></activity>
The solution should be clear by now:- Remove the duplicate
tag from the AndroidManifest.xml file - Build the application again
- Reload the application
This is quite the opposite of forgetting to add an Activity class to the manifest file. And, yet, it leads to a failure just the same. Proper maintenance of the manifest file is important. It's not a file to mess around with.
Happy Android Coding!
Jumat, 11 Februari 2011
Contacts Contract: Intro and Getting Started
If you've been using Android awhile, and have used the Contacts feature at all, you may have noticed that when you push your SDK forward a few versions, many of the calls are now listed as deprecated.
This is because the Android project revamped how the contacts system works in Android 2.0 (API Level 5). The updated system is much more flexible, while also taking a bit more code to use properly. Over at Mobiletuts+, we wrote an article quite a while back that has a quick overview of using the new APIs in context of using the contact picker. Android Essentials: Using the Contact Picker demonstrates how the queries are now often broken up due to increase in the number of internal tables used (or, that's mostly likely the cause).
You can also directly view the open source code for this tutorial.
This is because the Android project revamped how the contacts system works in Android 2.0 (API Level 5). The updated system is much more flexible, while also taking a bit more code to use properly. Over at Mobiletuts+, we wrote an article quite a while back that has a quick overview of using the new APIs in context of using the contact picker. Android Essentials: Using the Contact Picker demonstrates how the queries are now often broken up due to increase in the number of internal tables used (or, that's mostly likely the cause).
You can also directly view the open source code for this tutorial.
Kamis, 03 Februari 2011
Tip: New Layout Editor Exceptions
Does your Android Eclipse layout editor look like Figure 1? Does it show "Missing theme." or perhaps an error in the logs (perhaps something to do with "com.android.ide.eclipse.editors.layout.LayoutEditor")? These are frequent occurrences on the very latest Android SDK Tools.
If you're having these types of issues, the solution may be simple. See that empty dropdown on the far right? Perhaps it's not empty, but shows the Android version? Yeah, the one highlighted in Figure 2 shown below... Click on this dropdown and pick one of the options.
Does your layout editor now look like Figure 3? If so, you're all set. If not, you'll need more than just this tip.
Why the new dropdown? We believe that it will show what a layout should look like on various versions of Android platform. So, presumably, you'll want to pick your Target SDK most of the time and if, during testing, you find a problem outside the target SDK, this drop down may help speed up layout debugging.
Happy Android Coding!
![]() |
| Figure 1 Layout Editor errors (Click for large view) |
![]() |
| Figure 2 Layout Editor Drop Down (Click for large view) |
![]() |
| Figure 3 Layout Editor, no errors (Click for large view) |
Happy Android Coding!
Label:
android,
errors,
layout,
layout editor
Selasa, 01 Februari 2011
New Feature: Book Code Downloads
Many readers have found it difficult to access the book code downloads from the official publisher site. After some discussion with our editor, we are pleased to inform you that we now have them hosted separately and available for easy, direct download. (No login should be needed and certainly no verification that you own the book. But you already bought it, right? :) )
In addition to providing a new source for downloading the files, we have also provided a single download for all of the code for each book.
The download link is convenient found right next to the Home link above, under "Book Code Downloads."
Happy Android Coding!
In addition to providing a new source for downloading the files, we have also provided a single download for all of the code for each book.
The download link is convenient found right next to the Home link above, under "Book Code Downloads."
Happy Android Coding!
Langganan:
Postingan (Atom)
Category
- 1.5 (2)
- 1.5 1.5 R1 (2)
- 1.6r2 (1)
- 2.0 (3)
- 2.0.1 (1)
- 4.0 (2)
- activity (1)
- activitymanager (1)
- address (1)
- amazon (2)
- android (54)
- android 3.0 (1)
- android 3.2 (1)
- android compatibility (2)
- android ndk (1)
- android sdk (2)
- Android Virtual Device (3)
- API (1)
- App (3)
- App Store (2)
- app widget (1)
- apple (1)
- appwidget (1)
- archos (2)
- article (1)
- articles (1)
- atrix (1)
- atrix4g (1)
- AVD (3)
- awad (2)
- awad2e (2)
- beginner (1)
- Berlin (1)
- blackberry (3)
- book (13)
- books (2)
- borders (1)
- brick (1)
- bug (3)
- bugs (1)
- business (5)
- business case (1)
- business plans (3)
- buzz (1)
- camangi (1)
- cell phone (3)
- class (1)
- code (8)
- code name (1)
- coding (2)
- college (1)
- commercial (1)
- compatibility (1)
- compatibility scaling (1)
- compiling (1)
- conference (1)
- contacts (1)
- contactscontract (1)
- coupon (1)
- coursework (1)
- cupcake (2)
- cute (1)
- DEBUG_TAG (1)
- debugging (1)
- defect tracking (3)
- defects (1)
- design (1)
- designer (1)
- developer (8)
- development (15)
- device (1)
- devices (2)
- diagnostics (1)
- discounts (1)
- distribution (1)
- donut (1)
- download (1)
- droidcon (2)
- e-book (2)
- e-version (1)
- eclair (1)
- Eclipse (6)
- ed (1)
- edu (1)
- emulator (2)
- errata (2)
- error (2)
- errors (2)
- europe (1)
- excerpt (1)
- exercise (1)
- extension (1)
- feedback (1)
- fix (1)
- fragmentation (1)
- free (3)
- froyo (1)
- fruit (1)
- fun (1)
- Germany (1)
- gingerbread (4)
- giveaway (2)
- Google (7)
- hardware (3)
- help (1)
- higher education (1)
- holiday (1)
- Home screen (1)
- honeycomb (2)
- host (1)
- ice cream sandwich (2)
- ics (2)
- IDE (1)
- implementation (1)
- incentive (1)
- informit (1)
- installation (1)
- internationalization (1)
- iPhone (4)
- issue (1)
- Junit (1)
- korea (2)
- korean (1)
- L14 (1)
- language (1)
- layout (2)
- layout editor (1)
- learning (2)
- level 13 (1)
- local (1)
- locale (1)
- localization (1)
- logging (2)
- mac (2)
- macos (1)
- manifest (1)
- maps (1)
- marketplace (5)
- mobile (13)
- mobile platform (5)
- mobiletuts+ (1)
- moblie (1)
- monetization (1)
- motorola (1)
- news (1)
- paid (1)
- parse (1)
- plug-in (2)
- plugin (1)
- preview (3)
- project risk (2)
- provider (1)
- published (3)
- publishing (2)
- purchase (3)
- QA (1)
- quality assurance (1)
- question (1)
- raw (1)
- raw resources (1)
- reading (3)
- release (1)
- resources (1)
- review (1)
- revisions (1)
- root (1)
- safari (1)
- sale (1)
- sample (2)
- samples (1)
- SAMS (7)
- sams2e (2)
- scaling (1)
- SDK (7)
- SDK update (3)
- server (1)
- slides (1)
- snapshot (1)
- Software (3)
- source code (3)
- source control (2)
- student (1)
- sty (1)
- subscription (1)
- tablet (1)
- tablets (1)
- tale (1)
- teacher (1)
- teaching (3)
- testing (3)
- tips (4)
- tools (2)
- translation (1)
- travel (1)
- tricks (1)
- tutorial (5)
- unit testing (1)
- update (2)
- updates (2)
- upgrade (5)
- URI (1)
- version (4)
- video (2)
- VideoView (1)
- widget (1)
- wireless (14)
- workaround (1)





