<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>RemoteDroid &#187; Tech</title>
	<atom:link href="/blog/category/tech/feed/" rel="self" type="application/rss+xml" />
	<link>https://remotedroid.net/blog</link>
	<description>Use Your Android Phone as a Remote Trackpad!</description>
	<lastBuildDate>Sun, 26 Feb 2012 06:19:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Ubuntu and Windows 7 dual-boot on the Lenovo x120e</title>
		<link>https://remotedroid.net/blog/2011/11/08/ubuntu-and-windows-7-dual-boot-on-the-lenovo-x120e/</link>
		<comments>https://remotedroid.net/blog/2011/11/08/ubuntu-and-windows-7-dual-boot-on-the-lenovo-x120e/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 04:19:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">https://remotedroid.net/blog/?p=72</guid>
		<description><![CDATA[So, I decided to get a Lenovo ThinkPad x120e for development purposes. The Chromebook I got from Google I/O made me appreciate the value of a light laptop with massive battery life, and the experience of installing Ubuntu on it made me think that I could actually start using something like that for development purposes. [...]]]></description>
			<content:encoded><![CDATA[<p>So, I decided to get a Lenovo ThinkPad x120e for development purposes. The Chromebook I got from Google I/O made me appreciate the value of a light laptop with massive battery life, and the experience of installing Ubuntu on it made me think that I could actually start using something like that for development purposes. Of course, the disadvantages of the Chromebook are that it&#8217;s not necessarily easy to install different OSes on it, and the stupid, stupid touchpad. The SSD can be upgraded, so that&#8217;s not a big deal.</p>
<p>&#8211;RANT&#8211;<br />
One of the reasons I got into Android way back in the G1 days was that I wanted a decent smartphone, but having played around with iPhones, I really liked physical keyboards as well, so along comes the G1, and I was instantly sold. The trend towards buttonless trackpads is terrible for the same reasons soft keyboards aren&#8217;t the end all, be all. A soft keyboard will NEVER be as comfortable as a real one for extended typing sessions, and buttonless trackpads will ALWAYS misinterpret your touches a certain percent of the time.<br />
&#8211;END RANT&#8211;</p>
<p>Anyway, the x120e comes with a few disadvantages too:<br />
1) It&#8217;s default Windows 7 installation comes with a ton of bloatware, and<br />
2) For something that&#8217;s supposed to have a ton of battery life, an HDD seems silly.</p>
<p>So of course I ripped the HDD out, and replaced it with a <a href="http://www.google.com/products/catalog?q=samsung+470+128gb&#038;um=1&#038;ie=UTF-8&#038;tbm=shop&#038;cid=8906457126495640791&#038;sa=X&#038;ei=pKe4TpvqEOOiiQKHm-jNBA&#038;ved=0CFgQ8wIwAA">Samsung 470 series 128gb SSD</a>. Works great.</p>
<p>Of course, the next step was Ubuntu. There&#8217;s a number of pages detailing what you need to do to get Ubuntu running on the x120e, and I&#8217;ve already posted about one of the pitfalls I encountered, so &#8217;nuff said for the mo.</p>
<p>Eventually, I decided I wanted to dual-boot Windows 7 though, since Ubuntu is great, but it&#8217;s not as well supported as it could be, software-wise (GIMP is just bad) and WINE isn&#8217;t perfect. Here&#8217;s where I ran into problems.</p>
<p>I&#8217;d reserved some space, knowing I was going to install Windows 7 eventually, but when the time came to do it, Windows refused to install, saying that it couldn&#8217;t be installed to a GPT type disk or something. Googling it didn&#8217;t help much, so I decided to backup the Ubuntu installation using dd, nuke everything, and try again. I repartitioned the disk using the Windows 7 installer, and installed.</p>
<p>Windows installed fine at that point, but then the Ubuntu installer couldn&#8217;t see the Windows install, and tole me the disk was blank. Googling around led me to some people saying that if you use GParted to create an NTFS partition, everything works, so I did that, and it did. I then re-installed Windows, and when it came time to install Ubuntu, it saw the Windows install, and everything was hunky-dory.</p>
<p>Until I rebooted, and I never got the GRUB menu. Well huh. I tried installing <a href="http://neosmart.net/dl.php?id=1">EasyBCD</a>, but then when I tried going to Ubuntu, all I got was a GRUB prompt, and nothing else.</p>
<p>The solution to that eventually wound up being to take the hard drive out, put it in a USB enclosure, hook it up to another Ubuntu machine, and use sudo grub-install to reinstall GRUB.</p>
<p>The full process:<br />
1) Hook the drive up to Ubuntu machine #2<br />
2) Use GParted to figure out which device the drive was. (In this case, /dev/sdc. The Ubuntu partition was /dev/sdc5)<br />
3) sudo mount /dev/sdc5 /mnt<br />
4) sudo grub-install &#8211;root-directory=/mnt /dev/sdc</p>
<p>On reboot, I got a bunch of scary &#8220;Error, file not found:&#8221; messages that went away after awhile. Eventually, I got to an actual command prompt, typed sudo grub-update, and after that, everything was cool.</p>
<p>Side note:</p>
<p>Because I was restoring from a disk image, and because the drive configuration had changed in the meantime, I had to go into /etc/fstab, and change the UUIDs there to the appropriate ones for the new configuration. You can find the UUIDs for your partitions using GParted.</p>
<p>There were a ton more dead ends and missteps that I&#8217;ve left out, but those were the major pain points. At the moment,the only problem is that if you go from Windows 7 to Ubuntu with a warm boot, Ubuntu freezes, but cold booting works fine.</p>
]]></content:encoded>
			<wfw:commentRss>https://remotedroid.net/blog/2011/11/08/ubuntu-and-windows-7-dual-boot-on-the-lenovo-x120e/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu on the Thinkpad x120e</title>
		<link>https://remotedroid.net/blog/2011/10/10/ubuntu-on-the-thinkpad-x120e/</link>
		<comments>https://remotedroid.net/blog/2011/10/10/ubuntu-on-the-thinkpad-x120e/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 10:13:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">https://remotedroid.net/blog/?p=64</guid>
		<description><![CDATA[To paraphrase JFK, we do not choose to install Ubuntu, or any other form of Linux because it is easy, we install it because it is hard. That said, it&#8217;s not as hard as it could be, unless you install the wrong version. First, I installed the 32-bit version, which was what was recommended on [...]]]></description>
			<content:encoded><![CDATA[<p>To paraphrase JFK, we do not choose to install Ubuntu, or any other form of Linux because it is easy, we install it because it is hard.</p>
<p>That said, it&#8217;s not as hard as it could be, unless you install the wrong version. First, I installed the 32-bit version, which was what was recommended on the Ubuntu site. Everything went pretty well until I tried running <a href="http://www.minecraft.net">Minecraft.</a> I got as far as the create a new world screen, then it crashed. The solution: Install the 64-bit version. (The issue in this case is that fglrx, the proprietary video drivers for my video card, don&#8217;t play well with Java when you use 32 bit Ubuntu. 64 bit works.)</p>
<p>Of course, this lead down a Google rabbit-hole. I messed up the re-install because I didn&#8217;t specify an EFI bootloader partition, and the Ubuntu installer didn&#8217;t warn me that it wouldn&#8217;t work. (You get the No operating system found message.) Then some sort of graphics misconfiguration meant that when it tried to boot into Unity, (which I already hate) all I got was a blank screen. Three or four reboots later, this problem somehow sorted itself out, whereupon I disabled Unity, then apt-got fglrx, and after that, everything seemed to work fine. That still left replacing OpenJDK with Sun&#8217;s JRE. (apt-get remove openjdk-6-jre openjdk-6-jre-headless. That seemed to remove everything that needed to be removed.) Minecraft now runs, (I think. I did get a crash which corrupted my save file, but that was after messing with graphics options pretty intensely for five minutes or so.) It&#8217;s not perfect. Being Java, it seems like GCs cause stuttering, but being able to play it at all on what&#8217;s basically a slightly beefier netbook it kinda cool.</p>
<p>Now, I just need to install Eclipse and the Android SDK, and I can strop using my lapburney Macbook!</p>
<p>Here&#8217;s some useful links if you want to try this:<br />
<a href="https://help.ubuntu.com/community/X120e">The Ubuntu community page for the x120e</a><br />
<a href="https://wiki.archlinux.org/index.php/IBM_ThinkPad_X120e">The ArchLinux wiki page</a><br />
<a href="http://filthypants.blogspot.com/2011/03/ubuntu-natty-on-lenovo-thinkpad-x120e.html">A good blog post about this</a></p>
]]></content:encoded>
			<wfw:commentRss>https://remotedroid.net/blog/2011/10/10/ubuntu-on-the-thinkpad-x120e/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android and https</title>
		<link>https://remotedroid.net/blog/2011/09/14/android-and-https/</link>
		<comments>https://remotedroid.net/blog/2011/09/14/android-and-https/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 20:34:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">https://remotedroid.net/blog/?p=58</guid>
		<description><![CDATA[I recently had to deal with using https with Apache&#8217;s http libraries. Not a simple task. If you just create a Uri with https in front of it, and your SSL certificate isn&#8217;t from a trusted authority, or if you&#8217;re using a self-signed certificate, you&#8217;re in for a world of hurt. There&#8217;s a lot of [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had to deal with using https with Apache&#8217;s http libraries. Not a simple task. If you just create a Uri with https in front of it, and your SSL certificate isn&#8217;t from a trusted authority, or if you&#8217;re using a self-signed certificate, you&#8217;re in for a world of hurt.</p>
<p>There&#8217;s a lot of solutions out there, and most of them involve trusting everyone, which isn&#8217;t so secure. The best solution I found is here:</p>
<p><a href="http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html">Crazy Bob: Trusting SSL Certificates</a></p>
<p>It&#8217;s reasonably secure, but in order to use it, you&#8217;ll need the 1.6 JDK. You don&#8217;t need the Android SDK to create the needed keystore.</p>
<p><b>[UPDATE]</b></p>
<p>That method works if you&#8217;re only going to one domain. All other domains stop working with that method. A better method can be found at this Stack Overflow question:</p>
<p><a href="http://stackoverflow.com/questions/2642777/trusting-all-certificates-using-httpclient-over-https/6378872#6378872">http://stackoverflow.com/questions/2642777/trusting-all-certificates-using-httpclient-over-https/6378872#6378872</a></p>
<p>The code here appends your KeyStores to Android&#8217;s list, which is a much better solution. You&#8217;ll still need the method for generating a keystore in the first link.</p>
]]></content:encoded>
			<wfw:commentRss>https://remotedroid.net/blog/2011/09/14/android-and-https/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slow Android autocomplete in Eclipse Helios</title>
		<link>https://remotedroid.net/blog/2011/01/21/slow-android-autocomplete-in-eclipse-helios/</link>
		<comments>https://remotedroid.net/blog/2011/01/21/slow-android-autocomplete-in-eclipse-helios/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 10:30:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">https://remotedroid.net/blog/?p=56</guid>
		<description><![CDATA[Eclipse Helios has been slow for me for awhile, and it finally annoyed me enough to try to google a solution. This guy found a good, relatively easy fix. Basically, you&#8217;re just downloading the Android source, and adding it to your Android SDK directory. Hit the link for full details.]]></description>
			<content:encoded><![CDATA[<p>Eclipse Helios has been slow for me for awhile, and it finally annoyed me enough to try to google a solution.</p>
<p><a href="http://envyandroid.com/archives/66/slow-android-autocomplete-eclipse-helios-36">This guy</a> found a good, relatively easy fix.</p>
<p>Basically, you&#8217;re just downloading the Android source, and adding it to your Android SDK directory. Hit the link for full details.</p>
]]></content:encoded>
			<wfw:commentRss>https://remotedroid.net/blog/2011/01/21/slow-android-autocomplete-in-eclipse-helios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Referencing drawables in HTML in Android&#8217;s WebView</title>
		<link>https://remotedroid.net/blog/2011/01/14/referencing-drawables-in-html-in-androids-webview/</link>
		<comments>https://remotedroid.net/blog/2011/01/14/referencing-drawables-in-html-in-androids-webview/#comments</comments>
		<pubDate>Fri, 14 Jan 2011 14:52:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">https://remotedroid.net/blog/?p=54</guid>
		<description><![CDATA[Here&#8217;s another interesting Android quirk: So let&#8217;s say you have a webview that you want to populate with HTML from an arbitrary source, and you want to use an image in the res/drawable directory. You could try webview.loadData(html, &#8220;text/html&#8221;, &#8220;UTF-8&#8243;), and within the HTML, use &#60;img src=&#34;file:///android_res/drawable/icon.png&#34; /&#62; or something, but that won&#8217;t work. Instead, [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s another interesting Android quirk:</p>
<p>So let&#8217;s say you have a webview that you want to populate with HTML from an arbitrary source, and you want to use an image in the res/drawable directory. You could try webview.loadData(html, &#8220;text/html&#8221;, &#8220;UTF-8&#8243;), and within the HTML, use</p>
<p>&lt;img src=&quot;file:///android_res/drawable/icon.png&quot; /&gt;</p>
<p>or something, but that won&#8217;t work. Instead, this is what I had to do:</p>
<pre>
WebView webview = (WebView)this.findViewById(R.id.webview);
String html = "&lt;html&gt;&lt;head&gt;&lt;title&gt;TITLE!!!&lt;/title&gt;&lt;/head&gt;";
html += "&lt;body&gt;&lt;h1&gt;Image?&lt;/h1&gt;&lt;img src=&quot;icon.png&quot; /&gt;&lt;/body&gt;&lt;/html&gt;";
webview.loadDataWithBaseURL("file:///android_res/drawable/", html, "text/html", "UTF-8", null);
</pre>
<p>So basically, for some reason, you absolutely have to use loadDataWithBaseURL.</p>
<p>&#8211;</p>
<h5>UPDATE</h5>
<p>This only seems to work with 2.2 (API level <img src='/blog/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> and up.</p>
]]></content:encoded>
			<wfw:commentRss>https://remotedroid.net/blog/2011/01/14/referencing-drawables-in-html-in-androids-webview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Basic authentication with HttpClient on Android using https and PUT</title>
		<link>https://remotedroid.net/blog/2010/12/15/basic-authentication-with-httpclient-on-android-using-https-and-put/</link>
		<comments>https://remotedroid.net/blog/2010/12/15/basic-authentication-with-httpclient-on-android-using-https-and-put/#comments</comments>
		<pubDate>Wed, 15 Dec 2010 09:46:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">https://remotedroid.net/blog/?p=52</guid>
		<description><![CDATA[&#8216;ve been beating my head against a wall for hours with this one. The examples I&#8217;d been using all returned HTTP 400 Bad Request, and Apache&#8217;s HttpClient is cryptic enough so that the reason for this wasn&#8217;t obvious. The reason for this response still isn&#8217;t obvious, but thanks to Kyle Lampe, I now have some [...]]]></description>
			<content:encoded><![CDATA[<p>&#8216;ve been beating my head against a wall for hours with this one. The examples I&#8217;d been using all returned HTTP 400 Bad Request, and Apache&#8217;s HttpClient is cryptic enough so that the reason for this wasn&#8217;t obvious. The reason for this response still isn&#8217;t obvious, but thanks to Kyle Lampe, I now have some code that actually works:</p>
<pre>
try {
    String data = "YOUR REQUEST BODY HERE";
    //
    CredentialsProvider credProvider = new BasicCredentialsProvider();
    credProvider.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
        new UsernamePasswordCredentials("YOUR USER NAME HERE", "YOUR PASSWORD HERE"));
    //
    DefaultHttpClient http = new DefaultHttpClient();
    http.setCredentialsProvider(credProvider);
    //
    HttpPut put = new HttpPut("YOUR HTTPS URL HERE");
    try {
        put.setEntity(new StringEntity(data, "UTF8"));
    } catch (UnsupportedEncodingException e) {
        Log.e(TAG, "UnsupportedEncoding: ", e);
    }
    put.addHeader("Content-type","SET CONTENT TYPE HERE IF YOU NEED TO");
    HttpResponse response = http.execute(put);
    Log.d(TAG, "This is what we get back:"+response.getStatusLine().toString()+", "+response.getEntity().toString());
} catch (ClientProtocolException e) {
    //
    Log.d(TAG, "Client protocol exception", e);
} catch (IOException e) {
    //
    Log.d(TAG, "IOException", e);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>https://remotedroid.net/blog/2010/12/15/basic-authentication-with-httpclient-on-android-using-https-and-put/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Push notifications with Urban Airship on Android</title>
		<link>https://remotedroid.net/blog/2010/10/13/push-notifications-with-urban-airship-on-android/</link>
		<comments>https://remotedroid.net/blog/2010/10/13/push-notifications-with-urban-airship-on-android/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 12:05:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">https://remotedroid.net/blog/?p=50</guid>
		<description><![CDATA[So I&#8217;m testing out push notifications using Urban Airship&#8217;s system, and I&#8217;ve been ripping my hair out for the last day or so trying to get my app to respond to them. It turns out that the example code they have on their site doesn&#8217;t actually work. If you do everything exactly as they say, [...]]]></description>
			<content:encoded><![CDATA[<p>So I&#8217;m testing out push notifications using <a href="http://urbanairship.com/">Urban Airship&#8217;s</a> system, and I&#8217;ve been ripping my hair out for the last day or so trying to get my app to respond to them. It turns out that the example code they have on their site doesn&#8217;t actually work. If you do everything exactly as they say, you&#8217;ll either get a ActivityNotFoundException when the BroadcastReceiver tries to start your activity, or you&#8217;ll get an ANR, and a log trace that looks like this:</p>
<pre>
E/Bundle  ( 1101): readBundle: bad magic number
E/Bundle  ( 1101): readBundle: trace = java.lang.RuntimeException
E/Bundle  ( 1101): 	at android.os.Bundle.readFromParcelInner(Bundle.java:1580)
E/Bundle  ( 1101): 	at android.os.Bundle.<init>(Bundle.java:82)
E/Bundle  ( 1101): 	at android.os.Parcel.readBundle(Parcel.java:1381)
E/Bundle  ( 1101): 	at android.os.Parcel.readBundle(Parcel.java:1366)
E/Bundle  ( 1101): 	at android.content.Intent.readFromParcel(Intent.java:5479)
E/Bundle  ( 1101): 	at android.content.Intent.<init>(Intent.java:5453)
E/Bundle  ( 1101): 	at android.content.Intent$1.createFromParcel(Intent.java:5444)
E/Bundle  ( 1101): 	at android.content.Intent$1.createFromParcel(Intent.java:5446)
E/Bundle  ( 1101): 	at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:132)
E/Bundle  ( 1101): 	at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:1480)
E/Bundle  ( 1101): 	at android.os.Binder.execTransact(Binder.java:288)
E/Bundle  ( 1101): 	at dalvik.system.NativeStart.run(Native Method)
</pre>
<p>What&#8217;s happening is that you register a PushReceiver with the AirMail control panel app, which then creates and sends an intent to start your activity. The problem being, (I think) that the intent gets sent from the scope of the AirMail app, meaning it wont necessarily have access to your classes.</p>
<p>The way I finally got this to work is by using the setClassName(String, String) method of the intent to explicitly set the packagename and class name of the activity I wanted. Stick this in the onClick method of your PushReceiver:</p>
<pre>
Intent i = new Intent();
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setClassName("com.example", "com.example.YourActivity");
YourApplication.this.startActivity(i);
</pre>
]]></content:encoded>
			<wfw:commentRss>https://remotedroid.net/blog/2010/10/13/push-notifications-with-urban-airship-on-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google analytics drops metrics in Android if you send them too quickly</title>
		<link>https://remotedroid.net/blog/2010/09/14/google-analytics-drops-metrics-in-android-if-you-send-them-too-quickly/</link>
		<comments>https://remotedroid.net/blog/2010/09/14/google-analytics-drops-metrics-in-android-if-you-send-them-too-quickly/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 10:04:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">https://remotedroid.net/blog/?p=48</guid>
		<description><![CDATA[I just ran into this problem with the Google Analytics SDK for Android (v0.8). Basically, if you try to send too many pageviews too quickly, the tracker gets overwhelmed and forgets to track some of them. My solution was just to space things out a bit with Timers and TimerTasks. I have a small wrapper [...]]]></description>
			<content:encoded><![CDATA[<p>I just ran into this problem with the Google Analytics SDK for Android (v0.8). Basically, if you try to send too many pageviews too quickly, the tracker gets overwhelmed and forgets to track some of them.</p>
<p>My solution was just to space things out a bit with Timers and TimerTasks. I have a small wrapper around the analytics tracker, which has a timer, a static inner TimerTask class, and a long which is the soonest that a pageview should be sent. Whenever you want to send a pageview, you just call recordView, which looks like this:</p>
<pre>
public void recordView(String metric) {
        // The current time.
        long time = new Date().getTime();
        // We keep track of the next appropriate time to send a metric with sendTime. sendTime only gets updated
        // when we try to send something,
        if (this.sendTime > time) {
        	time = this.sendTime;
        }
        this.sendTimer.schedule(new TrackTask(this, metric), new Date(time));
        // I have sendInterval set to 2000, meaning pageviews are sent at a minimum, two seconds apart.
        this.sendTime = time + this.sendInterval;
}
</pre>
<p>Then, TrackTask looks like this:</p>
<pre>
protected static class TrackTask extends TimerTask {
    	//
    	private WeakReference<Metrics> ref;
    	private String metric;

    	public TrackTask(Metrics met, String metric) {
                // WeakReference to avoid memory leaks.
    		this.ref = new WeakReference<Metrics>(met);
    		this.metric = metric;
    	}

    	public void run() {
                // try catch block because our WeakReference has the possibility of being GCed out from under us.
    		try {
    			this.ref.get().tracker.trackPageView(this.metric);
    			this.ref.get().tracker.dispatch();
    		} catch (NullPointerException e) {
    		}
    	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>https://remotedroid.net/blog/2010/09/14/google-analytics-drops-metrics-in-android-if-you-send-them-too-quickly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting items in a ListView to show Alpha values</title>
		<link>https://remotedroid.net/blog/2010/09/07/getting-items-in-a-listview-to-show-alpha-values/</link>
		<comments>https://remotedroid.net/blog/2010/09/07/getting-items-in-a-listview-to-show-alpha-values/#comments</comments>
		<pubDate>Tue, 07 Sep 2010 16:52:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">https://remotedroid.net/blog/?p=46</guid>
		<description><![CDATA[So I was trying to implement a ListView in Android the other day where the items would have varying levels of alpha transparency in the background. For some reason, every item&#8217;s background would go black whenever the ListView scrolled. (presumably for performance reasons.) Googling around yielded not much, but a co-worker had solved this problem [...]]]></description>
			<content:encoded><![CDATA[<p>So I was trying to implement a ListView in Android the other day where the items would have varying levels of alpha transparency in the background. For some reason, every item&#8217;s background would go black whenever the ListView scrolled. (presumably for performance reasons.) Googling around yielded not much, but a co-worker had solved this problem in a previous app. Looking through the layout file, I saw that the android:cacheColorHint was set in his layout, but not mine. Adding it solved the problem.</p>
<p>Basically, just adding android:cacheColorHint=&#8221;#00000000&#8243; to the ListView enabled transparency while scrolling.</p>
]]></content:encoded>
			<wfw:commentRss>https://remotedroid.net/blog/2010/09/07/getting-items-in-a-listview-to-show-alpha-values/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android memory leaks</title>
		<link>https://remotedroid.net/blog/2010/08/13/android-memory-leaks/</link>
		<comments>https://remotedroid.net/blog/2010/08/13/android-memory-leaks/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 01:34:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">https://remotedroid.net/blog/?p=44</guid>
		<description><![CDATA[Since I&#8217;ve been banging my head against this for the last 12 hours, I thought I&#8217;d post a solution here, so other people might stumble across it and benefit. I ran into two memory leaks in Android itself in WebView, and Typeface. Both are because of bugs in the OS, so if you&#8217;re encountering memory [...]]]></description>
			<content:encoded><![CDATA[<p>Since I&#8217;ve been banging my head against this for the last 12 hours, I thought I&#8217;d post a solution here, so other people might stumble across it and benefit.</p>
<p>I ran into two memory leaks in Android itself in <a href="http://developer.android.com/reference/android/webkit/WebView.html">WebView</a>, and <a href="http://developer.android.com/reference/android/graphics/Typeface.html">Typeface</a>. Both are because of bugs in the OS, so if you&#8217;re encountering memory leaks, and all your code looks pretty watertight, (Meaning you never pass Activities as a Context to a View, and you use WeakReferences for static inner classes) you might be hitting one of these.</p>
<p>The first bug for WebView is described <a href="http://code.google.com/p/android/issues/detail?id=5067">here.</a></p>
<p>The solution is just to call destroy() on your webview in the onDestroy() method of the containing activity, then set any references to that WebView to null, just in case. The app I&#8217;m working on is webview heavy, so this was causing some grief.</p>
<p>The second bug for Typeface is described <a href="http://code.google.com/p/android/issues/detail?id=9904">here.</a></p>
<p>The issue was that I was creating a new Typeface from assets in the onCreate method of my activity. Every time I did this, it was allocating around 700k of memory, which then never got released. Big, big problems. The solution in this case is to initialize the typeface object in a static class (You can subclass Application and stick it there if you want, but be aware that you can&#8217;t call getAssets() before the first activity gets it&#8217;s onCreate method called.) and then use that one instance for any TextViews you may have.</p>
<p>The only way I managed to figure out what was causing the leaks was to go into adb shell, and then use dumpsys meminfo. That showed me a whole lot of bad.</p>
]]></content:encoded>
			<wfw:commentRss>https://remotedroid.net/blog/2010/08/13/android-memory-leaks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
