I learn languages by writing in them, making mistakes, and looking up answers online mostly :)
But with Java I took special care and read a bunch of books, including Josh Bloch's Effective Java. I saw a Bloch give a talk on this book while I was at Google and was inspired to read it.
It's great to have books as references - I have O'Reilly books for Ruby, Python, and PHP, but nothing quite beats learning by doing.
I learned the nuances of Android while working on a team and reading a lot of other people's code. Seeing how others write in a language, and questioning the how/why, is key to learning a language.