title: Android - basic download progress text
body: <p>I found a snippet online for showing a download's progress. The error I'm getting is <code>android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.</code> My goal is to have the phone download a file and then when completed, switch to the chaptermenu intent</p>
  
  <pre><code>import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.net.HttpURLConnection;
  import java.net.MalformedURLException;
  import java.net.URL;
  
  import android.app.Activity;
  import android.content.Intent;
  import android.os.Bundle;
  import android.os.Environment;
  import android.widget.TextView;
  
  public class CheckDownload extends Activity {
  
  /** Called when the activity is first created. */
  @Override
  protected void onCreate(Bundle SavedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(SavedInstanceState);
      setContentView(R.layout.downloadscreen);
      Thread timer = new Thread() {
          public void run() {
              try {
                  // set the download URL, a url that points to a file on the
                  // internet
                  // this is the file to be downloaded
                  URL url = new URL(
                          "http://www.android.com/media/wallpaper/gif/android_logo.gif");
  
                  // create the new connection
                  HttpURLConnection urlConnection = (HttpURLConnection) url
                          .openConnection();
  
                  // set up some things on the connection
                  urlConnection.setRequestMethod("GET");
                  urlConnection.setDoOutput(true);
  
                  // and connect!
                  urlConnection.connect();
  
                  // set the path where we want to save the file
                  // in this case, going to save it on the root directory of
                  // the
                  // sd card.
                  File SDCardRoot = Environment.getExternalStorageDirectory();
                  // create a new file, specifying the path, and the filename
                  // which we want to save the file as.
                  File file = new File(SDCardRoot, "android_logo.gif");
  
                  // this will be used to write the downloaded data into the
                  // file we created
                  FileOutputStream fileOutput = new FileOutputStream(file);
  
                  // this will be used in reading the data from the internet
                  InputStream inputStream = urlConnection.getInputStream();
  
                  // this is the total size of the file
                  int totalSize = urlConnection.getContentLength();
                  // variable to store total downloaded bytes
                  int downloadedSize = 0;
  
                  // create a buffer...
                  byte[] buffer = new byte[1024];
                  int bufferLength = 0; // used to store a temporary size of
                                          // the buffer
  
                  // now, read through the input buffer and write the contents
                  // to the file
                  while ((bufferLength = inputStream.read(buffer)) &gt; 0) {
                      // add the data in the buffer to the file in the file
                      // output stream (the file on the sd card
                      fileOutput.write(buffer, 0, bufferLength);
                      // add up the size so we know how much is downloaded
                      downloadedSize += bufferLength;
                      // this is where you would do something to report the
                      // prgress, like this maybe
                      updateProgress(downloadedSize, totalSize);
  
                  }
                  // close the output stream when done
                  fileOutput.close();
  
                  // catch some possible errors...
              } catch (MalformedURLException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              } finally {
                  Intent chapterMenuIntentObject = new Intent(
                          "com.blah.blah.CHAPTERMENU");
                  startActivity(chapterMenuIntentObject);
              }
          }
  
      };
      timer.start();
  }
  
  public void updateProgress(int downloadedSize, int totalSize) {
      int percentage = downloadedSize / totalSize * 100;
      String stringy = "Download Progress: " + percentage + "%";
      TextView textytext = (TextView) findViewById(R.id.downloadscreentextview);
      textytext.setText(stringy);
  }
  
  @Override
  protected void onPause() {
      // TODO Auto-generated method stub
      super.onPause();
      finish();
  }
  
  }
  </code></pre>