<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Toastmo]]></title>
  <link href="http://twotoasters.github.com/toastmo/atom.xml" rel="self"/>
  <link href="http://twotoasters.github.com/toastmo/"/>
  <updated>2013-01-24T13:53:38-05:00</updated>
  <id>http://twotoasters.github.com/toastmo/</id>
  <author>
    <name><![CDATA[Two Toasters, LLC]]></name>
    <email><![CDATA[rachit@twotoasters.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[UIAppearance for fun and profit]]></title>
    <link href="http://twotoasters.github.com/toastmo/blog/2013/01/17/uiappearance/"/>
    <updated>2013-01-17T09:27:00-05:00</updated>
    <id>http://twotoasters.github.com/toastmo/blog/2013/01/17/uiappearance</id>
    <content type="html"><![CDATA[<p>Building custom user interfaces is something our <a href="http://twotoasters.com">iOS development team</a> encounters on a daily basis. Anything you can do to make it faster to develop or make your reusable controls easily customizable is an easy victory. <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html">UIAppearance</a> gives you this easy victory.</p>

<p>While <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html">UIAppearance</a> isn&#8217;t a brand new topic, it seems to get less love than it should. <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html">UIAppearance</a> is a protocol available since <strong>iOS 5</strong> that allows a developer to quickly configure the appearance of user interface controls provided by Apple. The fact that that your custom controls can take part in UIAppearance is talked about even less. This post will cover the basics of using UIAppearance and will explore adding support to your custom interface components.</p>

<h2>UIAppearance Basics</h2>

<p>You&#8217;ll be glad to know that <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html">UIAppearance</a> is a straightforward API with almost no learning curve. To use it you need only know three things.</p>

<ul>
<li>Properties and methods exposed to UIAppearance are decorated with the <code>UI_APPEARANCE_SELECTOR</code> attribute.</li>
<li>The class method <code>+[UIControl appearance]</code> will set the UIAppearance system to apply the specified properties when the control is created.</li>
<li>The class method <code>+[UIControl appearanceWhenContainedIn:]</code> will set the UIAppearance system to apply the specified properties when the control is created, but only when it is created in the specified containers.</li>
</ul>


<p>That is all there is to it. <code>UI_APPEARANCE_SELECTOR</code>, <code>+ appearance</code>, <code>+ appearanceWhenContainedIn:</code></p>

<h2>Adding some style to UINavigationBar</h2>

<p>Let&#8217;s see how this works. Say you want to style your <em>UINavigationBar</em> to be something a little different than the standard iOS style. First, look at the header file for <em>UINavigationBar</em> (you can find this by right-clicking on the symbol and choosing &#8216;Jump to Definition&#8217; on it in Xcode).</p>

<p>Search for <code>UI_APPEARANCE_SELECTOR</code>. You&#8217;ll see it attached to many of the properties and methods, but not all. This is your guide to what is available by <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html">UIAppearance</a>. In our case, the first time we see the attribute is with:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="k">@property</span><span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span><span class="n">retain</span><span class="p">)</span> <span class="n">UIColor</span> <span class="o">*</span><span class="n">tintColor</span> <span class="n">UI_APPEARANCE_SELECTOR</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This means that the tintColor property is available for UIAppearance. This means I can now apply a global style affecting the tint to all <em>UINavigationBar</em> objects by telling the appearance proxy:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="p">[[</span><span class="n">UINavigationBar</span> <span class="n">appearance</span><span class="p">]</span> <span class="nl">setTintColor:</span><span class="p">[</span><span class="n">UIColor</span> <span class="n">redColor</span><span class="p">]];</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, no matter where a <em>UINavigationBar</em> is displayed within my app, it will be tinted red. Classy.</p>

<p>You can make this even more specific by telling the style to only apply when it is inside your own <code>YOURCustomViewController</code>. Consider the code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="p">[[</span><span class="n">UINavigationBar</span> <span class="nl">appearanceWhenContainedIn:</span><span class="p">[</span><span class="n">YOURCustomViewController</span> <span class="n">class</span><span class="p">],</span> <span class="nb">nil</span><span class="p">]</span>
</span><span class='line'>                               <span class="nl">setTintColor:</span><span class="p">[</span><span class="n">UIColor</span> <span class="n">redColor</span><span class="p">]];</span>
</span></code></pre></td></tr></table></div></figure>


<p>You&#8217;ve now told it to only apply the red tint color when a <em>UINavigationBar</em> is displayed inside a <em>YOURCustomViewController</em>. However, if I add a <em>UINavigationBar</em> to another view controller, it will not be tinted red. Only in the case that an instance of a <em>UINavigationBar</em> is in the hierarchy below an instance of a <em>YOURCustomViewController</em> will it be tinted red. Still classy.</p>

<p>All of these appearance styles can be applied as early as you like in your application. For example, you can set all your styles in <code>-[UIApplicationDelegate application:didFinishLaunchingWithOptions:]</code>.</p>

<h2>Supporting different iOS versions</h2>

<p>As can often occur when working with any API, certain versions of can provide different functionality. How can we build an application level style when the available methods and properties on Apple&#8217;s controls are changing?</p>

<p>Thankfully, Objective-C is a dynamic language that allows runtime introspection on your objects. In a similar style to how you would ask your object if it <code>-respondsToSelector:</code>, you can ask a class if it&#8217;s <em>instances</em> respond to a method as well.</p>

<p>Consider this sample:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="k">if</span> <span class="p">([</span><span class="n">UINavigationBar</span> <span class="nl">instancesRespondToSelector:</span><span class="k">@selector</span><span class="p">(</span><span class="nl">setShadowImage:</span><span class="p">)])</span> <span class="p">{</span>
</span><span class='line'>    <span class="p">[[</span><span class="n">UINavigationBar</span> <span class="n">appearance</span><span class="p">]</span> <span class="nl">setShadowImage:</span><span class="n">awesomeShadow</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>shadowImage</code> property is new to <strong>iOS 6</strong>. Using <code>+[NSObject instancesRespondToSelector:</code>, we can inspect whether <em>any</em> instance of an object of this type will respond to this selector. Since you&#8217;ll be using the class type to apply an appearance, <strong>not an instance</strong>, this class method will tell you if this property can be used.</p>

<h2>Using UIAppearance in your custom UI views</h2>

<p>As stated earlier, you too can take advantage of UIAppearance in your custom views. Following the same pattern as seen above, let&#8217;s create a UIButton subclass that provides a property through UIAppearance.</p>

<p>I want to expose the font of the label on a UIButton. After subclassing, I&#8217;ll create a property that is decorated with <code>`UI_APPEARANCE_SELECTOR</code> called <code>titleFont</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="k">@interface</span> <span class="nc">TWTButton</span> : <span class="nc">UIButton</span>
</span><span class='line'>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n">UIFont</span> <span class="o">*</span><span class="n">titleFont</span> <span class="n">UI_APPEARANCE_SELECTOR</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, I create the setter implementation and set the title label&#8217;s font property.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="cp">#import &quot;TWTButton.h&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@implementation</span> <span class="nc">TWTButton</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">setTitleFont:</span><span class="p">(</span><span class="n">UIFont</span> <span class="o">*</span><span class="p">)</span><span class="nv">titleFont</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">_titleFont</span> <span class="o">!=</span> <span class="n">titleFont</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">_titleFont</span> <span class="o">=</span> <span class="n">titleFont</span><span class="p">;</span>
</span><span class='line'>        <span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">titleLabel</span> <span class="nl">setFont:</span><span class="n">_titleFont</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, you can set its appearance as if it was always available via <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html">UIAppearance</a>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="p">[[</span><span class="n">TWTButton</span> <span class="n">appearance</span><span class="p">]</span> <span class="nl">setTitleFont:</span><span class="n">myFont</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>For a more detailed example of this, check out <a href="https://gist.github.com/d20337095c696330460e">TWTButton</a></strong>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Android Helpers]]></title>
    <link href="http://twotoasters.github.com/toastmo/blog/2013/01/09/android-external-storage-helper/"/>
    <updated>2013-01-09T10:01:00-05:00</updated>
    <id>http://twotoasters.github.com/toastmo/blog/2013/01/09/android-external-storage-helper</id>
    <content type="html"><![CDATA[<p>Java helpers are simply classes that work can be delegated to. There is no difference in Android applications. Keeping helper classes small, tight and focused can improve your app. Here are some advantages:</p>

<ul>
<li>Enforce framework requirements in a concise way.</li>
<li>Wrap platform differences</li>
<li>Keep your code DRY</li>
</ul>


<p>First things first. Create a class with a private constructor. That will prevent accidental instantiation of the helper class. For our purposes, the helper class will simply be a collection of public static methods.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ExternalStorageHelper</span> <span class="o">{</span>
</span><span class='line'>  <span class="kd">private</span> <span class="nf">ExternalStorageHelper</span><span class="o">()</span> <span class="o">{}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Enforce framework requirements</h3>

<p>Let&#8217;s use Android&#8217;s <a href="https://developer.android.com/guide/topics/data/data-storage.html#filesExternal">external storage</a> as an example for building a helper class. Before working with external storage, <a href="https://developer.android.com/reference/android/os/Environment.html#getExternalStorageState()">getExternalStorageState()</a> should be called to check it&#8217;s availability. The call returns a String and checking the value can be a little ceremonial. It might be cleaner just to ask the boolean question you care about.</p>

<p>The method isExternalStorageMounted() shows that you can ask that simple question to test for the required availability.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">static</span> <span class="kt">boolean</span> <span class="nf">isExternalStorageMounted</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">Environment</span><span class="o">.</span><span class="na">getExternalStorageState</span><span class="o">().</span><span class="na">equals</span><span class="o">(</span><span class="n">Environment</span><span class="o">.</span><span class="na">MEDIA_MOUNTED</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In a <a href="https://twitter.com/romainguy/status/282975428136824832">recent tweet</a>, Romain Guy reminded developers to put data in the right place on external storage. Your app might benefit from the media scanner by placing files in the correct location. A helper method can enforce this and you only have to remember the details once. Here, music files can be directed to appropriate directory.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">static</span> <span class="n">File</span> <span class="nf">openMusicDirectory</span><span class="o">(</span><span class="n">Context</span> <span class="n">context</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="o">(</span><span class="n">isExternalStorageMounted</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="o">(</span><span class="n">Build</span><span class="o">.</span><span class="na">VERSION</span><span class="o">.</span><span class="na">SDK_INT</span> <span class="o">&gt;=</span> <span class="n">Build</span><span class="o">.</span><span class="na">VERSION_CODES</span><span class="o">.</span><span class="na">FROYO</span><span class="o">)</span> <span class="o">?</span>
</span><span class='line'>          <span class="n">context</span><span class="o">.</span><span class="na">getExternalFilesDir</span><span class="o">(</span><span class="n">Environment</span><span class="o">.</span><span class="na">DIRECTORY_MUSIC</span><span class="o">)</span> <span class="o">:</span>
</span><span class='line'>          <span class="n">openDirectory</span><span class="o">(</span><span class="s">&quot;music&quot;</span><span class="o">);</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">private</span> <span class="kd">static</span> <span class="n">File</span> <span class="nf">openDirectory</span><span class="o">(</span><span class="n">String</span> <span class="n">dirname</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">File</span> <span class="n">f</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="o">(</span><span class="n">isExternalStorageMounted</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">File</span> <span class="n">storageDir</span> <span class="o">=</span> <span class="n">Environment</span><span class="o">.</span><span class="na">getExternalStorageDirectory</span><span class="o">();</span>
</span><span class='line'>      <span class="n">f</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">storageDir</span><span class="o">,</span> <span class="n">dirname</span><span class="o">);</span>
</span><span class='line'>      <span class="k">if</span> <span class="o">(</span><span class="n">f</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">f</span><span class="o">.</span><span class="na">exists</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">f</span><span class="o">.</span><span class="na">mkdirs</span><span class="o">();</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">f</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Wrap platform differences</h3>

<p>Prior to API 8, files were written using <a href="https://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory()">getExternalStorageDirectory()</a>. Beginning with API 8, <a href="https://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String)">getExternalFilesDir()</a> is used with a type parameter to enable the media scanner to properly categorize files.</p>

<p>You can make your application&#8217;s files available for sharing. In openPublicPicturesDirectory(), we use the required directory to share images that will not be deleted with the application. Despite the runtime API level, the files will be saved in a sharable, public directory.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">static</span> <span class="n">File</span> <span class="nf">openPublicPicturesDirectory</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="o">(</span><span class="n">isExternalStorageMounted</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="o">(</span><span class="n">Build</span><span class="o">.</span><span class="na">VERSION</span><span class="o">.</span><span class="na">SDK_INT</span> <span class="o">&gt;=</span> <span class="n">Build</span><span class="o">.</span><span class="na">VERSION_CODES</span><span class="o">.</span><span class="na">FROYO</span><span class="o">)</span> <span class="o">?</span>
</span><span class='line'>          <span class="n">Environment</span><span class="o">.</span><span class="na">getExternalStoragePublicDirectory</span><span class="o">(</span><span class="n">Environment</span><span class="o">.</span><span class="na">DIRECTORY_PICTURES</span><span class="o">)</span> <span class="o">:</span>
</span><span class='line'>          <span class="n">openPublicDirectory</span><span class="o">(</span><span class="s">&quot;Pictures&quot;</span><span class="o">);</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">private</span> <span class="kd">static</span> <span class="n">File</span> <span class="nf">openPublicDirectory</span><span class="o">(</span><span class="n">String</span> <span class="n">dirname</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">File</span> <span class="n">f</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="o">(</span><span class="n">isExternalStorageMounted</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">File</span> <span class="n">storageDir</span> <span class="o">=</span> <span class="n">Environment</span><span class="o">.</span><span class="na">getExternalStorageDirectory</span><span class="o">();</span>
</span><span class='line'>      <span class="n">f</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">storageDir</span><span class="o">,</span> <span class="n">dirname</span><span class="o">);</span>
</span><span class='line'>      <span class="k">if</span> <span class="o">(</span><span class="n">f</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">f</span><span class="o">.</span><span class="na">exists</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">f</span><span class="o">.</span><span class="na">mkdirs</span><span class="o">();</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">f</span><span class="o">;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Another example, getCacheDir(), also shows this ability to wrap platform differences. The cache directory is a useful location to temporarily persist files. If external storage is not mounted, we fallback to the device internal memory using <a href="https://developer.android.com/reference/android/content/Context.html#getCacheDir(java.lang.String)">Context.getCacheDir()</a>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">static</span> <span class="n">File</span> <span class="nf">getCacheDir</span><span class="o">(</span><span class="n">Context</span> <span class="n">context</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nf">isExternalStorageMounted</span><span class="o">()</span> <span class="o">?</span> <span class="n">getExternalCacheDir</span><span class="o">(</span><span class="n">context</span><span class="o">)</span> <span class="o">:</span> <span class="n">getCacheDirByContext</span><span class="o">(</span><span class="n">context</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">private</span> <span class="kd">static</span> <span class="n">File</span> <span class="nf">getExternalCacheDir</span><span class="o">(</span><span class="n">Context</span> <span class="n">context</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="o">(</span><span class="n">Build</span><span class="o">.</span><span class="na">VERSION</span><span class="o">.</span><span class="na">SDK_INT</span> <span class="o">&gt;=</span> <span class="n">Build</span><span class="o">.</span><span class="na">VERSION_CODES</span><span class="o">.</span><span class="na">FROYO</span><span class="o">)</span> <span class="o">?</span>
</span><span class='line'>          <span class="n">context</span><span class="o">.</span><span class="na">getExternalCacheDir</span><span class="o">()</span> <span class="o">:</span>
</span><span class='line'>          <span class="n">context</span><span class="o">.</span><span class="na">getCacheDir</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">private</span> <span class="kd">static</span> <span class="n">File</span> <span class="nf">getCacheDirByContext</span><span class="o">(</span><span class="n">Context</span> <span class="n">context</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">context</span><span class="o">.</span><span class="na">getCacheDir</span><span class="o">();</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>If external storage is available, it will use it, provided the device is running API 8 or higher. Otherwise, it will fallback to internal memory as before.</p>

<h1>Keep your code DRY</h1>

<p>These are small methods. Even so, copying and pasting little snippets throughout your app is a code smell. The helper is just enough context to wrap reusable functionality.</p>

<p>There are some legit objections to helper functions, especially when they are used as a dumping ground for unrelated functionality. They can resist refactoring since they aren&#8217;t in front of you all the time like the classes that call them. So keep it small and focus on your application&#8217;s needs. There&#8217;s no need to construct a generic library for everything. So, rewrite your helpers for each application if you want. That way you&#8217;re not locked into a strict library pattern of error or exception handling. Let your app be your guide.</p>

<p>It&#8217;s a little convenience that keeps your code clean and your head free of low level framework details.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Automated Automation Testing with Calabash]]></title>
    <link href="http://twotoasters.github.com/toastmo/blog/2012/12/12/automated-automation-testing/"/>
    <updated>2012-12-12T18:52:00-05:00</updated>
    <id>http://twotoasters.github.com/toastmo/blog/2012/12/12/automated-automation-testing</id>
    <content type="html"><![CDATA[<p>We are constantly looking for new processes and tools to help us create apps quickly and more efficiently. Testing the applications we create is an important part of this. <a href="http://calaba.sh">Calabash</a> is a tool based on <a href="http://cukes.info/">Cucumber</a> for doing Acceptance testing with iOS and Android apps. This is a great way to automate testing of the user interface of an application.</p>

<p>Here is a talk I gave at a <a href="http://meetup.trianglecocoa.com">CocoaHeads Raleigh-Durham</a> event earlier this year and at the latest <a href="http://cocoaconf.com">CocoaConf Raleigh</a>:</p>

<iframe src="http://player.vimeo.com/video/46555160?byline=0&amp;portrait=0&amp;badge=0&amp;color=ff9933" width="800" height="600" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Be careful using NSNotificationCenter with Blocks]]></title>
    <link href="http://twotoasters.github.com/toastmo/blog/2012/12/04/be-careful-using-nsnotificationcenter/"/>
    <updated>2012-12-04T10:15:00-05:00</updated>
    <id>http://twotoasters.github.com/toastmo/blog/2012/12/04/be-careful-using-nsnotificationcenter</id>
    <content type="html"><![CDATA[<p><a href="https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html">NSNotificationCenter</a> is a long existing mechanism for broadcasting messages to zero or many listeners. Many of Apple&#8217;s frameworks work deeply by notifiying you via an NSNotification when a message is posted. Traditionally, the workflow has been to follow a pattern similar to this:</p>

<figure class='code'><figcaption><span>Simple Receiving Notification Sample</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">viewDidLoad</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="p">[</span><span class="n">super</span> <span class="n">viewDidLoad</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[[</span><span class="n">NSNotificationCenter</span> <span class="n">defaultCenter</span><span class="p">]</span> <span class="nl">addObserver:</span><span class="n">self</span> <span class="nl">selector:</span><span class="k">@selector</span><span class="p">(</span><span class="nl">someMethod:</span><span class="p">)</span> <span class="nl">name:</span><span class="n">kMyNotificationIdentifier</span> <span class="nl">object:</span><span class="nb">nil</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">dealloc</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="p">[[</span><span class="n">NSNotificationCenter</span> <span class="n">defaultCenter</span><span class="p">]</span> <span class="nl">removeObserver:</span><span class="n">self</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">someMethod:</span><span class="p">(</span><span class="n">NSNotification</span> <span class="o">*</span><span class="p">)</span><span class="nv">note</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="c1">// Message received</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Blocks!</h2>

<p>As of iOS 4 and the introduction of blocks, Mac and iOS developers can now use blocks to subscribe to NSNotification broadcasts. This new method also allows you to specify an NSOperationQueue to perform the block action on.</p>

<figure class='code'><figcaption><span>Block-based NSNotificationCenter</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">viewDidLoad</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="p">[</span><span class="n">super</span> <span class="n">viewDidLoad</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[[</span><span class="n">NSNotificationCenter</span> <span class="n">defaultCenter</span><span class="p">]</span> <span class="nl">addObserverForName:</span><span class="n">kMyNotificationIdentifier</span> <span class="nl">object:</span><span class="nb">nil</span> <span class="nl">queue:</span><span class="nb">nil</span> <span class="nl">usingBlock:</span><span class="o">^</span><span class="p">(</span><span class="n">NSNotification</span> <span class="o">*</span><span class="n">note</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// message received</span>
</span><span class='line'>    <span class="p">}];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Wait, what?</h2>

<p>Not so fast! Who is the observer? What removes this observer? What if you load several view controllers that do this? This block based method is not as simple as it appears. Reading the docs, we learn that <code>addObserverForName:object:queue:usingBlock:</code> actually returns an opaque observer that you are meant to retain, and subsequently <code>-removeObserver</code> with. Let&#8217;s take a look at what this looks like.</p>

<figure class='code'><figcaption><span>Block-based NSNotificationCenter Properly</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="k">@implementation</span> <span class="nc">MyViewController</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">id</span> <span class="n">_notificationObserver</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// ...</span>
</span><span class='line'>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">viewDidLoad</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="p">[</span><span class="n">super</span> <span class="n">viewDidLoad</span><span class="p">];</span>
</span><span class='line'>    <span class="n">_notificationObserver</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSNotificationCenter</span> <span class="n">defaultCenter</span><span class="p">]</span> <span class="nl">addObserverForName:</span><span class="n">kMyNotificationIdentifier</span> <span class="nl">object:</span><span class="nb">nil</span> <span class="nl">queue:</span><span class="nb">nil</span> <span class="nl">usingBlock:</span><span class="o">^</span><span class="p">(</span><span class="n">NSNotification</span> <span class="o">*</span><span class="n">note</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// message received</span>
</span><span class='line'>    <span class="p">}];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// dealloc, or potentially a method popping this view from the stack</span>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">dealloc</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="p">[[</span><span class="n">NSNotificationCenter</span> <span class="n">defaultCenter</span><span class="p">]</span> <span class="nl">removeObserver:</span><span class="n">_notificationObserver</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, you still need to track the observer of a notification and remove it. Similar to what you would do if you were using the selector-based notification listener. Oddly enough, this is an example of a block-based API not really improving things. For this API, the selector-based NSNotificationCenter listener is a much simpler option as you don&#8217;t have to maintain the observer seperately.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Video: git bisect]]></title>
    <link href="http://twotoasters.github.com/toastmo/blog/2012/11/28/video-git-bisect/"/>
    <updated>2012-11-28T16:37:00-05:00</updated>
    <id>http://twotoasters.github.com/toastmo/blog/2012/11/28/video-git-bisect</id>
    <content type="html"><![CDATA[<p>Finding bugs in your iOS or Mac project can be difficult. Use a tool provided by git called &#8216;git bisect&#8217; to help find where a bug started in your application. It does a binary search to find the commit that introduced the bug.</p>

<p>To find out more information visit the git bisect <a href="http://www.kernel.org/pub/software/scm/git/docs/git-bisect.html">manual page</a>.</p>

<iframe src="http://player.vimeo.com/video/40230842?badge=0" width="800" height="600" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Introducing TTAlertView]]></title>
    <link href="http://twotoasters.github.com/toastmo/blog/2012/11/21/introducing-ttalertview/"/>
    <updated>2012-11-21T16:48:00-05:00</updated>
    <id>http://twotoasters.github.com/toastmo/blog/2012/11/21/introducing-ttalertview</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/twotoasters/TTAlertView">TTAlertView</a> is a drop-in replacement for <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAlertView_Class/UIAlertView/UIAlertView.html">UIAlertView</a> that allows the developer to customize the presentation of an alert. TTAlertView uses the familiar interface of UIAlertView, so you don&#8217;t have to worry about rewriting any of your code &#8211; just drop it in, add some assets, and -bam!- you have a unique, customized alert view for your app!</p>

<!--more-->


<h2>Using TTAlertView</h2>

<p>Using TTAlertView is simple. TTAlertView uses the familiar <code>initWithTitle:​message:​delegate:​cancelButtonTitle:​otherButtonTitles:</code>  and <code>show</code> methods to create and display your alert view. From there TTAlertView handles laying out and animating the view.</p>

<p>Lets see some code:</p>

<figure class='code'><figcaption><span>A Simple TTAlertView Example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">simpleAlert</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">TTAlertView</span> <span class="o">*</span><span class="n">alert</span> <span class="o">=</span> <span class="p">[[</span><span class="n">TTAlertView</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithTitle:</span><span class="s">@&quot;A Simple TTAlertView&quot;</span>
</span><span class='line'>                                                  <span class="nl">message:</span><span class="s">@&quot;... with the default layout!&quot;</span>
</span><span class='line'>                                                 <span class="nl">delegate:</span><span class="n">self</span>
</span><span class='line'>                                        <span class="nl">cancelButtonTitle:</span><span class="s">@&quot;Dismiss&quot;</span>
</span><span class='line'>                                        <span class="nl">otherButtonTitles:</span><span class="nb">nil</span><span class="p">];</span>
</span><span class='line'>  <span class="p">[</span><span class="n">alert</span> <span class="n">show</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>&#8230; which gives you this:</p>

<p><img src="http://f.cl.ly/items/0s101b290u2D463J3D0n/Screen%20Shot%202012-10-19%20at%2011.23.32%20AM.png" alt="A real simple TTAlertView" /></p>

<p>Of course, this alert hasn&#8217;t been customized at all, so it looks lame. Let&#8217;s see what adding in some custom images can do for us&#8230;</p>

<h2>Customizing TTAlertView</h2>

<p>To customize this alert view, we&#8217;re going to set the background image for <code>containerView</code> (the box containing the title, message, and buttons). Since TTAlertView handles the layout and, most importantly, the sizing of the <code>containerView</code>, using a resizable UIImage here is best practice &#8211; this guarantees that no matter the size of the <code>containerView</code>, the image will be stretched appropriately to fit.</p>

<p>We&#8217;re also going to add some button images using TTAlertView&#8217;s <code>setButtonBackgroundImage:​forState:​atIndex:</code> method. With this method we will set images for the button&#8217;s normal and highlighted states, again using resizable UIImages. (If you&#8217;re using textured button images or button images with text baked in, worry not – we&#8217;ll cover how to use these types of assets in a future blog post!)</p>

<p>Here&#8217;s some more code:</p>

<figure class='code'><figcaption><span>Customized TTAlertView Example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">fancyAlert</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">TTAlertView</span> <span class="o">*</span><span class="n">alert</span> <span class="o">=</span> <span class="p">[[</span><span class="n">TTAlertView</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithTitle:</span><span class="s">@&quot;A Fancy TTAlertView&quot;</span>
</span><span class='line'>                                                  <span class="nl">message:</span><span class="s">@&quot;... with images and designs!&quot;</span>
</span><span class='line'>                                                 <span class="nl">delegate:</span><span class="n">self</span>
</span><span class='line'>                                        <span class="nl">cancelButtonTitle:</span><span class="s">@&quot;Dismiss&quot;</span>
</span><span class='line'>                                        <span class="nl">otherButtonTitles:</span><span class="nb">nil</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// we don&#39;t want the background peeking through</span>
</span><span class='line'>    <span class="p">[</span><span class="n">alert</span><span class="p">.</span><span class="n">containerView</span> <span class="nl">setBackgroundColor:</span><span class="p">[</span><span class="n">UIColor</span> <span class="n">clearColor</span><span class="p">]];</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// resizable images work best</span>
</span><span class='line'>    <span class="n">UIImage</span> <span class="o">*</span><span class="n">backgroundImage</span> <span class="o">=</span> <span class="p">[</span><span class="n">bgImage</span> <span class="nl">resizableImageWithCapInsets:</span><span class="n">bgCapInsets</span><span class="p">];</span>
</span><span class='line'>    <span class="n">UIImage</span> <span class="o">*</span><span class="n">buttonOffImage</span> <span class="o">=</span> <span class="p">[</span><span class="n">btnOffImage</span> <span class="nl">resizableImageWithCapInsets:</span><span class="n">buttonCapInsets</span><span class="p">];</span>
</span><span class='line'>    <span class="n">UIImage</span> <span class="o">*</span><span class="n">buttonOnImage</span> <span class="o">=</span> <span class="p">[</span><span class="n">btnOnImage</span> <span class="nl">resizableImageWithCapInsets:</span><span class="n">buttonCapInsets</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[</span><span class="n">alert</span><span class="p">.</span><span class="n">containerView</span> <span class="nl">setImage:</span><span class="n">backgroundImage</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">alert</span> <span class="nl">setButtonBackgroundImage:</span><span class="n">buttonOffImage</span>
</span><span class='line'>                           <span class="nl">forState:</span><span class="n">UIControlStateNormal</span>
</span><span class='line'>                            <span class="nl">atIndex:</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">alert</span> <span class="nl">setButtonBackgroundImage:</span><span class="n">buttonOnImage</span>
</span><span class='line'>                           <span class="nl">forState:</span><span class="n">UIControlStateHighlighted</span>
</span><span class='line'>                            <span class="nl">atIndex:</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[</span><span class="n">alert</span> <span class="n">show</span><span class="p">];</span>
</span><span class='line'>  
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>&#8230; and voilá!</p>

<p><img src="http://f.cl.ly/items/2z3t3j2z0V2f3X3L031t/Screen%20Shot%202012-10-19%20at%2011.41.56%20AM.png" alt="A fancy, styled TTAlertView" /></p>

<h2>We&#8217;re done here</h2>

<p>A quick shout-out to one of our favorite clients: <a href="http://www.gotryiton.com/">Go Try It On</a>. GTIO provided the assets used in the stylized alert example seen above &#8211; the assets were taken from the custom alert view in GTIO&#8217;s app, which is where TTAlertView was pioneered!</p>

<p>This is just a taste of TTAlertView&#8217;s potential. In future posts we will cover more ways to use TTAlertView &#8211; like using fixed-size images, tweaking the layout, and supplying custom view hierarchies. Stay tuned!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Horizontal Image Scroller for Android]]></title>
    <link href="http://twotoasters.github.com/toastmo/blog/2012/11/14/Horizontal-Image-Scroller-for-Android/"/>
    <updated>2012-11-14T08:05:00-05:00</updated>
    <id>http://twotoasters.github.com/toastmo/blog/2012/11/14/Horizontal-Image-Scroller-for-Android</id>
    <content type="html"><![CDATA[<p>HorizontalImageScroller-Android is a UI widget library for Android that will let your users scroll through a horizontal list of images, and let you implement it without breaking a sweat.</p>

<!--more-->


<p>We wanted to include a horizontally-scrollable list of images so that many of them could be shown without much expense in smartphone screen real estate. Other information might need to be presented on the same screen as well, so our scroller would need to be hosted inside a vertical scroll view, and would have to play nice with its motion event handling. We also knew the images would need to be retrieved from a URL, and sometimes there would be many of them, so they would have to be lazy-loaded and cached locally.</p>

<p><img src="http://twotoasters.github.com/toastmo/images/posts/horizontal-image-scroller-android-room-77.png" alt="Horizontal Image Scroller in Room 77 app" /></p>

<p>HorizontalImageScroller-Android solves these problems, and makes it easy to implement in your own app. Imagine a scenario where you have a list of objects that contain URLs that correspond to photos, and you&#8217;d like to show those in a horizontally-scrollable list.</p>

<p>In the layout xml for your activity (or fragment, if that&#8217;s how you roll), just add the element:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;com.twotoasters.android.horizontalimagescroller.widget.HorizontalImageScroller</span>
</span><span class='line'>    <span class="na">android:id=</span><span class="s">&quot;@+id/my_horizontal_image_scroller&quot;</span>
</span><span class='line'>    <span class="na">android:layout_width=</span><span class="s">&quot;match_parent&quot;</span>
</span><span class='line'>    <span class="na">android:layout_height=</span><span class="s">&quot;wrap_content&quot;</span> <span class="nt">/&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then, in your activity&#8217;s <code>onCreate()</code> (or your fragment&#8217;s <code>onCreateView()</code>), just set up the scroller&#8217;s adapter with a list of ImageToLoadUrl objects.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ImageToLoad</span><span class="o">&gt;</span> <span class="n">images</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ImageToLoad</span><span class="o">&gt;();</span>
</span><span class='line'><span class="k">for</span> <span class="o">(</span><span class="n">YourObjectWithSomeImageUrlProperty</span> <span class="n">myObject</span> <span class="o">:</span> <span class="n">myListOfObjectsWithSomeImageUrlProperty</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">images</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">ImageToLoadUrl</span><span class="o">(</span><span class="n">myObject</span><span class="o">.</span><span class="na">getTheUrlToTheImage</span><span class="o">()));</span> <span class="c1">// adapt as necessary</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="n">HorizontalImageScroller</span> <span class="n">scroller</span> <span class="o">=</span> <span class="o">(</span><span class="n">HorizontalImageScroller</span><span class="o">)</span> <span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">my_horizontal_image_scroller</span><span class="o">);</span>
</span><span class='line'><span class="n">scroller</span><span class="o">.</span><span class="na">setAdapter</span><span class="o">(</span><span class="k">new</span> <span class="n">HorizontalImageScrollerAdapter</span><span class="o">(</span><span class="n">images</span><span class="o">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>For more detail, see the readme included with the <a href="https://github.com/twotoasters/HorizontalImageScroller-Android">HorizontalImageScroller-Android library</a>. For even more detail, see the included sample app. The above should be enough to get you started though.</p>

<p><img src="http://twotoasters.github.com/toastmo/images/posts/horizontal-image-scroller-android-sample.png" alt="Horizontal Image Scroller Sample app" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Video: Foundation Collections]]></title>
    <link href="http://twotoasters.github.com/toastmo/blog/2012/11/07/video-foundation-collections/"/>
    <updated>2012-11-07T08:05:00-05:00</updated>
    <id>http://twotoasters.github.com/toastmo/blog/2012/11/07/video-foundation-collections</id>
    <content type="html"><![CDATA[<p>Several of us at <a href="http://twotoasters.com">Two Toasters</a> are involved at local CocoaHeads meetups. We meet with other iOS and Mac developers to share beer, pizza, and knowledge. The big draw is a series of Keynote presentations. Topics range from Cocoa basics and new SDK features to arcane Core Foundation behavior.</p>

<p>Here&#8217;s a talk I gave this summer about Foundation&#8217;s lesser-known collection classes.</p>

<iframe src="http://player.vimeo.com/video/48228001?title=0&byline=0&portrait=0&color=ff9933" width="800" height="600" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<p>If you found this valuable, consider a local meetup group. Ours is <a href="http://www.cocoaheads.org/us/RaleighNorthCarolina/index.html">CocoaHeads RTP</a>, and we&#8217;d love to see you. If you&#8217;re remote, antisocial, or allergic to pizza, you can watch more of these videos at <a href="http://cocoaheads.tv">cocoaheads.tv</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Android Master Class Listener Aware AsyncTasks]]></title>
    <link href="http://twotoasters.github.com/toastmo/blog/2012/10/31/Android-Master-Class-Listener-Aware-AsyncTasks/"/>
    <updated>2012-10-31T08:18:00-04:00</updated>
    <id>http://twotoasters.github.com/toastmo/blog/2012/10/31/Android-Master-Class-Listener-Aware-AsyncTasks</id>
    <content type="html"><![CDATA[<p>The AsyncTask class provided within the Android framework is a convenient and powerful mechanism for integrating background tasks into applications with very little effort or thought from the developer. So long as the semantics are followed, it&#8217;s almost trivial to perform complex background processing, asynchronous progress updates and UI manipulations on completion. However, some caveats can lay hidden landmines for the unwary. We&#8217;ll explore a Listener-based paradigm to provide a bit more safety to this fundamental tool.</p>

<!--more-->


<h3>A quick review of <code>AsyncTask</code></h3>

<p>So we&#8217;re all on the same page, let&#8217;s provide a quick review of <code>AsyncTask</code> usage. <code>AsyncTask</code> has a flexible implementation that makes it possible to process any type of input, provide any type of progress, and return any type of final data. Let&#8217;s create a very simple &#8211; read: useless &#8211; example that counts some number of seconds down, providing some progress every second and creates a <code>Toast</code> when complete.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">twotoasters</span><span class="o">.</span><span class="na">toastmo</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.app.Activity</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.content.Intent</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.os.AsyncTask</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.os.Bundle</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.view.View</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.view.View.OnClickListener</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.widget.Button</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.widget.ProgressBar</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.widget.Toast</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">DontUseAsyncTaskLikeThisActivity</span> <span class="kd">extends</span> <span class="n">Activity</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">private</span> <span class="n">ProgressBar</span> <span class="n">_progressBar</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  
</span><span class='line'>  <span class="cm">/* (non-Javadoc)</span>
</span><span class='line'><span class="cm">  * @see android.app.Activity#onDestroy()</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="nd">@Override</span>
</span><span class='line'>  <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onDestroy</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="kd">super</span><span class="o">.</span><span class="na">onDestroy</span><span class="o">();</span>
</span><span class='line'>      <span class="n">_progressBar</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/* (non-Javadoc)</span>
</span><span class='line'><span class="cm">  * @see android.app.Activity#onCreate(android.os.Bundle)</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="nd">@Override</span>
</span><span class='line'>  <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
</span><span class='line'>      <span class="n">setContentView</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">main</span><span class="o">);</span>
</span><span class='line'>      <span class="n">_progressBar</span> <span class="o">=</span> <span class="o">(</span><span class="n">ProgressBar</span><span class="o">)</span><span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">progressBar1</span><span class="o">);</span>
</span><span class='line'>      
</span><span class='line'>      <span class="n">Button</span> <span class="n">button</span> <span class="o">=</span> <span class="o">(</span><span class="n">Button</span><span class="o">)</span><span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">switch_button</span><span class="o">);</span>
</span><span class='line'>      <span class="n">button</span><span class="o">.</span><span class="na">setText</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">string</span><span class="o">.</span><span class="na">switch_to_good</span><span class="o">);</span>
</span><span class='line'>      <span class="n">button</span><span class="o">.</span><span class="na">setOnClickListener</span><span class="o">(</span><span class="k">new</span> <span class="n">OnClickListener</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>          
</span><span class='line'>          <span class="nd">@Override</span>
</span><span class='line'>          <span class="kd">public</span> <span class="kt">void</span> <span class="nf">onClick</span><span class="o">(</span><span class="n">View</span> <span class="n">v</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>              <span class="n">Intent</span> <span class="n">i</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Intent</span><span class="o">(</span><span class="n">DontUseAsyncTaskLikeThisActivity</span><span class="o">.</span><span class="na">this</span><span class="o">,</span> <span class="n">ListenerAwareAsyncTaskDemoActivity</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
</span><span class='line'>              <span class="n">startActivity</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
</span><span class='line'>              <span class="n">finish</span><span class="o">();</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>      <span class="o">});</span>
</span><span class='line'>      
</span><span class='line'>      <span class="n">AsyncTask</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Integer</span><span class="o">,</span> <span class="n">Void</span><span class="o">&gt;</span> <span class="n">asyncTask</span> <span class="o">=</span> <span class="k">new</span> <span class="n">AsyncTask</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Integer</span><span class="o">,</span> <span class="n">Void</span><span class="o">&gt;()</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>          <span class="nd">@Override</span>
</span><span class='line'>          <span class="kd">protected</span> <span class="n">Void</span> <span class="nf">doInBackground</span><span class="o">(</span><span class="n">Integer</span><span class="o">...</span> <span class="n">params</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>              <span class="kt">int</span> <span class="n">totalTime</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="mi">0</span><span class="o">];</span>
</span><span class='line'>              <span class="kt">int</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>              
</span><span class='line'>              <span class="k">while</span><span class="o">(</span><span class="n">count</span> <span class="o">&lt;=</span> <span class="n">totalTime</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">isCancelled</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>                  <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>                      <span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">1000</span><span class="o">);</span>
</span><span class='line'>                  <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                      <span class="c1">// don&#39;t care!</span>
</span><span class='line'>                  <span class="o">}</span>
</span><span class='line'>                  
</span><span class='line'>                  <span class="k">this</span><span class="o">.</span><span class="na">publishProgress</span><span class="o">((</span><span class="kt">int</span><span class="o">)(((</span><span class="kt">float</span><span class="o">)</span><span class="n">count</span><span class="o">++</span> <span class="o">/</span> <span class="o">(</span><span class="kt">float</span><span class="o">)</span><span class="n">totalTime</span><span class="o">)</span> <span class="o">*</span> <span class="mi">100</span><span class="n">f</span><span class="o">));</span>
</span><span class='line'>              <span class="o">}</span>
</span><span class='line'>              <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>          <span class="cm">/* (non-Javadoc)</span>
</span><span class='line'><span class="cm">          * @see android.os.AsyncTask#onPostExecute(java.lang.Object)</span>
</span><span class='line'><span class="cm">          */</span>
</span><span class='line'>          <span class="nd">@Override</span>
</span><span class='line'>          <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onPostExecute</span><span class="o">(</span><span class="n">Void</span> <span class="n">result</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>              <span class="n">Toast</span><span class="o">.</span><span class="na">makeText</span><span class="o">(</span><span class="n">DontUseAsyncTaskLikeThisActivity</span><span class="o">.</span><span class="na">this</span><span class="o">,</span> <span class="s">&quot;Done!&quot;</span><span class="o">,</span> <span class="n">Toast</span><span class="o">.</span><span class="na">LENGTH_LONG</span><span class="o">).</span><span class="na">show</span><span class="o">();</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>          <span class="cm">/* (non-Javadoc)</span>
</span><span class='line'><span class="cm">          * @see android.os.AsyncTask#onProgressUpdate(Progress[])</span>
</span><span class='line'><span class="cm">          */</span>
</span><span class='line'>          <span class="nd">@Override</span>
</span><span class='line'>          <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onProgressUpdate</span><span class="o">(</span><span class="n">Integer</span><span class="o">...</span> <span class="n">progress</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>              <span class="c1">// oh dear</span>
</span><span class='line'>              <span class="n">_progressBar</span><span class="o">.</span><span class="na">setProgress</span><span class="o">(</span><span class="n">progress</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>      <span class="o">};</span>
</span><span class='line'>      
</span><span class='line'>      <span class="n">asyncTask</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="mi">120</span><span class="o">);</span>
</span><span class='line'>      
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>All of this is reasonably okay and a common usage of the <code>AsyncTask</code> paradigm. Unfortunately, it also crashes horribly in certain circumstances. Why? Because the <code>AsyncTask</code> lifecycle is completely decoupled from the <code>Activity</code> lifecycle (technically it&#8217;s <a href="http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance%28%29"><em>almost</em> completely decoupled</a>&#8230; but for this conversation, it may as well be). Unless cancelled, the <code>AsyncTask</code> lives on regardless what happens to the <code>Activity</code> that launched it.</p>

<h3>So what&#8217;s wrong with this?</h3>

<p>The easiest way to see the problem is to investigate what happens when we rotate the screen. There are other scenarios that might expose the issue, but the screen rotation configuration change is the most direct and easiest to exercise. By default, when Android processes a configuration change, the <code>Activity</code> is torn down and recreated from scratch.</p>

<p>In our case, we&#8217;re setting our <code>ProgressBar</code> to <code>null</code> in the <code>onDestroy()</code> method of our <code>Activity</code>. So on a configuration change, our <code>Activity</code> is torn down, our <code>_progressBar</code> field is set to <code>null</code> and our landmine is set. The next time our <code>AsyncTask</code> calls <code>onProgressUpdate()</code> a <code>NullPointException</code> will be thrown. This is rarely good.</p>

<p>Is this a contrived example? Of course! However, similar, less-contrived logic is often used in <code>AsyncTask</code> objects. &#8220;Wait a minute, why don&#8217;t you just <em>not</em> set the field to null!&#8221; Sure, that might avoid an NPE in this precise case, but it doesn&#8217;t address the underlying issue. <em>Our problem, at its root, is that the reference to what we&#8217;re updating within our <code>AsyncTask</code> is stale.</em></p>

<h3>How do we fix this?</h3>

<p>An approach that we often use is extending the <code>AsyncTask</code> to use a listener that we can register with as needed and unregister with if desired. This allows a tighter coupling with the <code>Activity</code> so that <code>AsyncTask</code> can always operate with a fresh reference. Here&#8217;s our <code>AsyncTask</code> subclass.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">twotoasters</span><span class="o">.</span><span class="na">toastmo</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.app.Activity</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.os.AsyncTask</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">ListenerAwareAsyncTask</span><span class="o">&lt;</span><span class="n">Params</span><span class="o">,</span> <span class="n">Progress</span><span class="o">,</span> <span class="n">Result</span><span class="o">&gt;</span> <span class="kd">extends</span> <span class="n">AsyncTask</span><span class="o">&lt;</span><span class="n">Params</span><span class="o">,</span> <span class="n">Progress</span><span class="o">,</span> <span class="n">Result</span><span class="o">&gt;</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/**</span>
</span><span class='line'><span class="cm">  * Our completion and progress listener. This is the thing that we&#39;ll call when things get</span>
</span><span class='line'><span class="cm">  * completed.</span>
</span><span class='line'><span class="cm">  * </span>
</span><span class='line'><span class="cm">  * @author bjdupuis</span>
</span><span class='line'><span class="cm">  *</span>
</span><span class='line'><span class="cm">  * @param &lt;Progress&gt;</span>
</span><span class='line'><span class="cm">  * @param &lt;Result&gt;</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">interface</span> <span class="nc">OnCompleteListener</span><span class="o">&lt;</span><span class="n">Progress</span><span class="o">,</span> <span class="n">Result</span><span class="o">&gt;</span> <span class="o">{</span>
</span><span class='line'>      <span class="kd">public</span> <span class="kt">void</span> <span class="nf">onComplete</span><span class="o">(</span><span class="n">Result</span> <span class="n">result</span><span class="o">);</span>
</span><span class='line'>      
</span><span class='line'>      <span class="kd">public</span> <span class="kt">void</span> <span class="nf">onProgress</span><span class="o">(</span><span class="n">Progress</span><span class="o">...</span> <span class="n">progress</span><span class="o">);</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  
</span><span class='line'>  <span class="cm">/**</span>
</span><span class='line'><span class="cm">  * Constructor that registers a listener.</span>
</span><span class='line'><span class="cm">  * </span>
</span><span class='line'><span class="cm">  * @param the base &lt;code&gt;Activity&lt;/code&gt; that the listener runs on</span>
</span><span class='line'><span class="cm">  * @param listener the listener to register.</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="kd">public</span> <span class="nf">ListenerAwareAsyncTask</span><span class="o">(</span><span class="n">Activity</span> <span class="n">activity</span><span class="o">,</span> <span class="n">OnCompleteListener</span><span class="o">&lt;</span><span class="n">Progress</span><span class="o">,</span> <span class="n">Result</span><span class="o">&gt;</span> <span class="n">listener</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">this</span><span class="o">();</span>
</span><span class='line'>      
</span><span class='line'>      <span class="n">register</span><span class="o">(</span><span class="n">activity</span><span class="o">,</span> <span class="n">listener</span><span class="o">);</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  
</span><span class='line'>  <span class="cm">/* (non-Javadoc)</span>
</span><span class='line'><span class="cm">  * @see android.os.AsyncTask#onPostExecute(java.lang.Object)</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="nd">@Override</span>
</span><span class='line'>  <span class="kd">final</span> <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onPostExecute</span><span class="o">(</span><span class="n">Result</span> <span class="n">result</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">if</span><span class="o">(</span><span class="n">_listener</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">_listener</span><span class="o">.</span><span class="na">onComplete</span><span class="o">(</span><span class="n">result</span><span class="o">);</span>
</span><span class='line'>      <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>          <span class="c1">// save the result so we can defer calling the completion</span>
</span><span class='line'>          <span class="c1">// listener when (and if) it re-registers</span>
</span><span class='line'>          <span class="n">_result</span> <span class="o">=</span> <span class="n">result</span><span class="o">;</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/* (non-Javadoc)</span>
</span><span class='line'><span class="cm">  * @see android.os.AsyncTask#onProgressUpdate(Progress[])</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="nd">@Override</span>
</span><span class='line'>  <span class="kd">final</span> <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onProgressUpdate</span><span class="o">(</span><span class="n">Progress</span><span class="o">...</span> <span class="n">values</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">if</span><span class="o">(</span><span class="n">_listener</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">_listener</span><span class="o">.</span><span class="na">onProgress</span><span class="o">(</span><span class="n">values</span><span class="o">);</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/**</span>
</span><span class='line'><span class="cm">  * Register a listener to be notified when the task completes and updates progress.</span>
</span><span class='line'><span class="cm">  * </span>
</span><span class='line'><span class="cm">  * @param listener the listener to call</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">register</span><span class="o">(</span><span class="n">Activity</span> <span class="n">activity</span><span class="o">,</span> <span class="n">OnCompleteListener</span><span class="o">&lt;</span><span class="n">Progress</span><span class="o">,</span> <span class="n">Result</span><span class="o">&gt;</span> <span class="n">listener</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">_listener</span> <span class="o">=</span> <span class="n">listener</span><span class="o">;</span>
</span><span class='line'>      
</span><span class='line'>      <span class="c1">// see if we had a deferred result available</span>
</span><span class='line'>      <span class="k">if</span><span class="o">(</span><span class="n">_result</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">activity</span><span class="o">.</span><span class="na">runOnUiThread</span><span class="o">(</span><span class="k">new</span> <span class="n">Runnable</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>              
</span><span class='line'>              <span class="nd">@Override</span>
</span><span class='line'>              <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>                  <span class="n">_listener</span><span class="o">.</span><span class="na">onComplete</span><span class="o">(</span><span class="n">_result</span><span class="o">);</span>
</span><span class='line'>                  <span class="n">_result</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>              <span class="o">}</span>
</span><span class='line'>          <span class="o">});</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  
</span><span class='line'>  <span class="cm">/**</span>
</span><span class='line'><span class="cm">  * Unregister the registered listener. If it&#39;s desirable for more than one listener </span>
</span><span class='line'><span class="cm">  * to be notified, it&#39;s trivial to have a list of listeners.</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">unregister</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">_listener</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  
</span><span class='line'>  <span class="c1">// the completion listener we&#39;ll call.</span>
</span><span class='line'>  <span class="kd">private</span> <span class="n">OnCompleteListener</span><span class="o">&lt;</span><span class="n">Progress</span><span class="o">,</span> <span class="n">Result</span><span class="o">&gt;</span> <span class="n">_listener</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>  
</span><span class='line'>  <span class="c1">// a temporary storage for the result.</span>
</span><span class='line'>  <span class="kd">private</span> <span class="n">Result</span> <span class="n">_result</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">private</span> <span class="nf">ListenerAwareAsyncTask</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can use this new class as follows:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">twotoasters</span><span class="o">.</span><span class="na">toastmo</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.app.Activity</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.content.Intent</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.os.Bundle</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.view.View</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.view.View.OnClickListener</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.widget.Button</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.widget.ProgressBar</span><span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">android.widget.Toast</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">com.twotoasters.toastmo.ListenerAwareAsyncTask.OnCompleteListener</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ListenerAwareAsyncTaskDemoActivity</span> <span class="kd">extends</span> <span class="n">Activity</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">static</span> <span class="n">ListenerAwareAsyncTask</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Integer</span><span class="o">,</span> <span class="n">Void</span><span class="o">&gt;</span> <span class="n">_myTask</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">private</span> <span class="n">ProgressBar</span> <span class="n">_progressBar</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>  
</span><span class='line'>  <span class="kd">private</span> <span class="n">OnCompleteListener</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Void</span><span class="o">&gt;</span> <span class="n">_myTaskListener</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OnCompleteListener</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Void</span><span class="o">&gt;()</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="nd">@Override</span>
</span><span class='line'>      <span class="kd">public</span> <span class="kt">void</span> <span class="nf">onComplete</span><span class="o">(</span><span class="n">Void</span> <span class="n">result</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">Toast</span><span class="o">.</span><span class="na">makeText</span><span class="o">(</span><span class="n">ListenerAwareAsyncTaskDemoActivity</span><span class="o">.</span><span class="na">this</span><span class="o">,</span> <span class="s">&quot;Done!&quot;</span><span class="o">,</span> <span class="n">Toast</span><span class="o">.</span><span class="na">LENGTH_LONG</span><span class="o">).</span><span class="na">show</span><span class="o">();</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="nd">@Override</span>
</span><span class='line'>      <span class="kd">public</span> <span class="kt">void</span> <span class="nf">onProgress</span><span class="o">(</span><span class="n">Integer</span><span class="o">...</span> <span class="n">progress</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">_progressBar</span><span class="o">.</span><span class="na">setProgress</span><span class="o">(</span><span class="n">progress</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>  <span class="o">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/* (non-Javadoc)</span>
</span><span class='line'><span class="cm">  * @see android.app.Activity#onDestroy()</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="nd">@Override</span>
</span><span class='line'>  <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onDestroy</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="kd">super</span><span class="o">.</span><span class="na">onDestroy</span><span class="o">();</span>
</span><span class='line'>      <span class="n">_progressBar</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Override</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
</span><span class='line'>      <span class="n">setContentView</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">main</span><span class="o">);</span>
</span><span class='line'>      <span class="n">_progressBar</span> <span class="o">=</span> <span class="o">(</span><span class="n">ProgressBar</span><span class="o">)</span><span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">progressBar1</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">Button</span> <span class="n">button</span> <span class="o">=</span> <span class="o">(</span><span class="n">Button</span><span class="o">)</span><span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">switch_button</span><span class="o">);</span>
</span><span class='line'>      <span class="n">button</span><span class="o">.</span><span class="na">setText</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">string</span><span class="o">.</span><span class="na">switch_to_bad</span><span class="o">);</span>
</span><span class='line'>      <span class="n">button</span><span class="o">.</span><span class="na">setOnClickListener</span><span class="o">(</span><span class="k">new</span> <span class="n">OnClickListener</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>          
</span><span class='line'>          <span class="nd">@Override</span>
</span><span class='line'>          <span class="kd">public</span> <span class="kt">void</span> <span class="nf">onClick</span><span class="o">(</span><span class="n">View</span> <span class="n">v</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>              <span class="n">Intent</span> <span class="n">i</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Intent</span><span class="o">(</span><span class="n">ListenerAwareAsyncTaskDemoActivity</span><span class="o">.</span><span class="na">this</span><span class="o">,</span> <span class="n">DontUseAsyncTaskLikeThisActivity</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
</span><span class='line'>              <span class="n">startActivity</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
</span><span class='line'>              <span class="n">finish</span><span class="o">();</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>      <span class="o">});</span>
</span><span class='line'>      
</span><span class='line'>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/*</span>
</span><span class='line'><span class="cm">  * (non-Javadoc)</span>
</span><span class='line'><span class="cm">  * </span>
</span><span class='line'><span class="cm">  * @see android.app.Activity#onPause()</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="nd">@Override</span>
</span><span class='line'>  <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onPause</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="kd">super</span><span class="o">.</span><span class="na">onPause</span><span class="o">();</span>
</span><span class='line'>      
</span><span class='line'>      <span class="k">if</span><span class="o">(</span><span class="n">_myTask</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">_myTask</span><span class="o">.</span><span class="na">unregister</span><span class="o">();</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/*</span>
</span><span class='line'><span class="cm">  * (non-Javadoc)</span>
</span><span class='line'><span class="cm">  * </span>
</span><span class='line'><span class="cm">  * @see android.app.Activity#onResume()</span>
</span><span class='line'><span class="cm">  */</span>
</span><span class='line'>  <span class="nd">@Override</span>
</span><span class='line'>  <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onResume</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="kd">super</span><span class="o">.</span><span class="na">onResume</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span><span class="o">(</span><span class="n">_myTask</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">_myTask</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ListenerAwareAsyncTask</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Integer</span><span class="o">,</span> <span class="n">Void</span><span class="o">&gt;(</span><span class="k">this</span><span class="o">,</span> <span class="n">_myTaskListener</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>              <span class="nd">@Override</span>
</span><span class='line'>              <span class="kd">protected</span> <span class="n">Void</span> <span class="nf">doInBackground</span><span class="o">(</span><span class="n">Integer</span><span class="o">...</span> <span class="n">params</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                  <span class="kt">int</span> <span class="n">totalTime</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="mi">0</span><span class="o">];</span>
</span><span class='line'>                  <span class="kt">int</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>                  
</span><span class='line'>                  <span class="k">while</span><span class="o">(</span><span class="n">count</span> <span class="o">&lt;=</span> <span class="n">totalTime</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">isCancelled</span><span class="o">())</span> <span class="o">{</span>
</span><span class='line'>                      <span class="k">try</span> <span class="o">{</span>
</span><span class='line'>                          <span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">1000</span><span class="o">);</span>
</span><span class='line'>                      <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>                          <span class="c1">// don&#39;t care!</span>
</span><span class='line'>                      <span class="o">}</span>
</span><span class='line'>                      
</span><span class='line'>                      <span class="k">this</span><span class="o">.</span><span class="na">publishProgress</span><span class="o">((</span><span class="kt">int</span><span class="o">)(((</span><span class="kt">float</span><span class="o">)</span><span class="n">count</span><span class="o">++</span> <span class="o">/</span> <span class="o">(</span><span class="kt">float</span><span class="o">)</span><span class="n">totalTime</span><span class="o">)</span> <span class="o">*</span> <span class="mi">100</span><span class="n">f</span><span class="o">));</span>
</span><span class='line'>                  <span class="o">}</span>
</span><span class='line'>                  <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'>              <span class="o">}</span>
</span><span class='line'>          <span class="o">};</span>
</span><span class='line'>          <span class="n">_myTask</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="mi">120</span><span class="o">);</span>
</span><span class='line'>      <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">_myTask</span><span class="o">.</span><span class="na">register</span><span class="o">(</span><span class="k">this</span><span class="o">,</span> <span class="n">_myTaskListener</span><span class="o">);</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You&#8217;ll notice our <code>doInBackground()</code>, <code>onProgress()</code>, and <code>onComplete()</code> do precisely the same things at the <code>Activity</code> level as their less-safe alternatives. The biggest difference is that our references will <em>always</em> be fresh. Another benefit we derive is that if the background task completes while we&#8217;re away, we&#8217;ll be notified as soon as we register of the completed result. This is particularly nice for <code>AsyncTask</code> objects that perform networking operations, since we won&#8217;t have &#8220;wasted&#8221; an out-and-back request/response.</p>

<h3>Example project</h3>

<p>I&#8217;ve created a <a href="https://github.com/twotoasters/Android-Master-Class-ListenerAwareAsyncTask">sample project</a> showing the &#8220;bad&#8221; way of doing things and the &#8220;better&#8221; way of doing things. When run on the emulator or device, try rotating the screen a few times in each case. When on the &#8220;bad&#8221; case, you&#8217;ll NPE with great regularity.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Objective-C Tricks: #1 Ternary Operations]]></title>
    <link href="http://twotoasters.github.com/toastmo/blog/2012/10/24/objective-c-tricks-number-1-ternary-operations/"/>
    <updated>2012-10-24T12:30:00-04:00</updated>
    <id>http://twotoasters.github.com/toastmo/blog/2012/10/24/objective-c-tricks-number-1-ternary-operations</id>
    <content type="html"><![CDATA[<p>Objective-C is a reflective and powerful object-oriented language. When first starting (or looking) at the syntax, many react fearfully to the verbosity and square brackets. Many rarely get beyond the basics they learned when making their first app, but there are many unused abilities in Objective-C.</p>

<h2>Ternary Operations with Objective-C objects</h2>

<p>Most people are familiar with <a href="http://en.wikipedia.org/wiki/Ternary_operation">ternary operations</a>. For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="n">NSString</span> <span class="o">*</span><span class="n">myString</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">isHighlighted</span><span class="p">]</span> <span class="o">?</span> <span class="s">@&quot;Highlighted&quot;</span> <span class="o">:</span> <span class="s">@&quot;Not Highlighted&quot;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Similar to this behavior in C:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">?</span> <span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Objective-C supports omitting the true side of the ternary operator  when working with objects. Consider a case where you need to set a string depending on whether another string is nil or not. You might try:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="n">NSString</span> <span class="o">*</span><span class="n">myString</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">;</span>
</span><span class='line'><span class="k">if</span> <span class="p">([</span><span class="n">self</span> <span class="n">otherString</span><span class="p">]</span> <span class="o">!=</span> <span class="nb">nil</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">myString</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">otherString</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">myString</span> <span class="o">=</span> <span class="n">kSomeConstantString</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can quickly clean this scenario up (down to one line, even). First, we remove the check against nil. When checking the state of an object ( <code>if (obj != nil) { ... }</code>), nil is a false statment and non-nil is a true statement. Therefore, we can update this to ( <code>if (! obj) { ... }</code> ). We can then expand that into a ternary operation.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="n">NSString</span> <span class="o">*</span><span class="n">myString</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">otherString</span><span class="p">]</span> <span class="o">?</span> <span class="p">[</span><span class="n">self</span> <span class="n">otherString</span><span class="p">]</span> <span class="o">:</span> <span class="n">kSomeConstantString</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can go a bit further in this scenario, however. Since the object we are checking is also the true side of the ternary operation, we can omit it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'><span class="n">NSString</span> <span class="o">*</span><span class="n">myString</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">otherString</span><span class="p">]</span> <span class="o">?</span> <span class="o">:</span> <span class="n">kSomeConstantString</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>UPDATE: Another thing that makes this useful is that the message to self is only sent once. <em>(Thanks to <a href="http://twitter.com/bmf">@bmf</a> making this point.)</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Welcome to ToastMo]]></title>
    <link href="http://twotoasters.github.com/toastmo/blog/2012/10/24/welcome-to-toastmo/"/>
    <updated>2012-10-24T08:18:00-04:00</updated>
    <id>http://twotoasters.github.com/toastmo/blog/2012/10/24/welcome-to-toastmo</id>
    <content type="html"><![CDATA[<p>On behalf of Two Toasters, welcome to ToastMo! We&#8217;re very excited to finally throw open the doors and share what we&#8217;re doing. What are we doing? First let&#8217;s talk about who we are and things will start getting clearer.</p>

<h3>Who is Two Toasters?</h3>

<p><a href="http://twotoasters.com">Two Toasters</a> is a growing, highly acclaimed mobile development company based out of Durham, NC and New York City. We love developing beautiful applications for our customers focused primarily on Android and iOS platforms. We&#8217;re <a href="http://www.addictivetips.com/mobile/find-and-buy-deals-on-meals-with-bitehunter-for-iphone/">pretty</a> <a href="http://www.intomobile.com/2012/01/17/airbnb-launches-slick-android-app-mobile-site/">good</a> at it, too, if we do say so ourselves. Since we&#8217;re growing, we&#8217;re always looking out for good young developers to turn into awesome veteran Android and iOS developers. We do a lot of teaching internally and decided as a company that it would be rewarding to extend that knowledge out the doors to the general mobile development community.</p>

<p>Why? Simply put, we like cool apps. More good mobile developers means more cool apps. <em>And</em> more good developers hopefully means fewer bad developers which leads to fewer <em>bad apps</em>. Bad apps make our souls bleed. We hate that.</p>

<h3>What is ToastMo?</h3>

<p>ToastMo is our repository of knowledge. It&#8217;s our place to post things we&#8217;ve learned, things we wish to teach, or things we think people should know. Some things on ToastMo will be basic, some will be advanced. Some things you might already know, some &#8211; hopefully most &#8211; you might not. We&#8217;ll be teaching things we teach our own junior developers, things that often aren&#8217;t necessarily obvious if you haven&#8217;t done it before. We&#8217;ll teach best practices we&#8217;ve developed over time based on our experience with our projects.</p>

<h3>How can I get involved?</h3>

<p>Thanks for joining us! Requests for future topics are always appreciated, so don&#8217;t hesitate to leave a comment.</p>

<ul>
<li>Want to develop with us? Email us at <a href="mailto:careers@twotoasters.com">careers@twotoasters.com</a></li>
<li>Need an app built? Email us at <a href="mailto:biz@twotoasters.com">biz@twotoasters.com</a></li>
</ul>

]]></content>
  </entry>
  
</feed>
