title: Java Can't create handler inside thread that has not called Looper.prepare()
body: <p>I saw most of the related questions, but I couldn't find any that fixed my problem.</p>
  
  <p>This is my code, and I have no idea what I'm doing wrong.</p>
  
  <pre><code>static class NamedFile {
      public File f;
  
      public String name;
      public String ext;
      public String path;
      public BitmapDrawable icon;
  
      public NamedFile (File file) {
          f = file;
          name = f.getName();
          if (f.isFile()) {
              if (name.indexOf('.') != -1) {
                  ext = name.substring(name.lastIndexOf('.') + 1).trim().toLowerCase();
              } else {
                  ext = "unknown";
              }
          }
          path = f.getAbsolutePath();
  
          if (ext == null) {
              icon = mFolderIcon;
          } else {
              BitmapDrawable i = icons.get(ext);
              if (i == null) {
                      try {
                          int rid = R.drawable.class.getField(ext).getInt(R.drawable.class);
                          icons.put(ext, new BitmapDrawable(Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, rid, mOpts), iconSize, iconSize, false)));
                          icon = icons.get(ext);
                      } catch (Exception e1) {}
              } else {
                  icon = i;
              }
          }/* else if (ext.equals("jpeg") || ext.equals("jpg") || ext.equals("bmp") || ext.equals("gif") || ext.equals("png")) {
              Bitmap b = BitmapFactory.decodeFile(path, mOpts);
              if (b != null) {
                  icon = new BitmapDrawable(Bitmap.createScaledBitmap(b, iconSize, iconSize, false));
              }
          }*/
  
          if (ext != null &amp;&amp; (ext.equals("jpeg") || ext.equals("jpg") || ext.equals("bmp") || ext.equals("gif") || ext.equals("png"))) {
              /*
              Bitmap b = BitmapFactory.decodeFile(path, mOpts);
              if (b != null) {
                  icon = new BitmapDrawable(Bitmap.createScaledBitmap(b, iconSize, iconSize, false));
              }
              */
  
              final Handler handler = new Handler() {
                  @Override
                  public void handleMessage(Message message) {
                      HashMap&lt;String, Object&gt; m = ((HashMap&lt;String, Object&gt;)message.obj);
                      sendThumbnail ((String)m.get("path"), (byte[])m.get("data"));
                  }
              };
  
  
              Thread thread = new Thread() {
                  public void writeInt (byte[] buff, int pos, int value) {
                      buff[pos] = (byte)(value &gt;&gt;&gt; 24);
                      buff[pos + 1] = (byte)(value &gt;&gt;&gt; 16);
                      buff[pos + 2] = (byte)(value &gt;&gt;&gt; 8);
                      buff[pos + 3] = (byte)value;
                  }
  
                  @Override
                  public void run() {
                      try {
                          Bitmap b = BitmapFactory.decodeFile(path, mOpts);
                          if (b.getHeight() &gt; 256 || b.getWidth() &gt; 256) {
                              float r;
                              if (b.getHeight() &gt; b.getWidth()) {
                                  r = 128f / b.getHeight();
                              } else {
                                  r = 128f / b.getWidth();
                              }
  
                              b = Bitmap.createScaledBitmap(b, (int)(r * b.getWidth()), (int)(r * b.getHeight()), false);
  
                              byte[] buffer = new byte[b.getWidth() * b.getHeight() * 4 + 8];
  
                              writeInt (buffer, 0, b.getWidth());
                              writeInt (buffer, 4, b.getHeight());
  
                              int i = 8;
                              for (int y = 0; y &lt; b.getHeight(); y ++) {
                                  for (int x = 0; x &lt; b.getWidth(); x ++) {
                                      writeInt (buffer, i, b.getPixel(x, y));
  
                                      i += 4;
                                  }
                              }
  
                              HashMap&lt;String, Object&gt; msg = new HashMap&lt;String, Object&gt;();
  
                              msg.put("path", path);
                              msg.put("data", buffer);
  
                              Message message = handler.obtainMessage(1, msg);
                              handler.sendMessage(message);
                          }
                      } catch (Exception e) {
                          sendLog (e.toString());
                      }
                  }
              };
              thread.start();
  
  
          }
  
          if (icon == null) {
              icon = mFileIcon;
          }
      }
      public NamedFile () {
      }
  
      public NamedFile simpleClone () {
          final NamedFile nf = new NamedFile();
  
          nf.name = name;
          nf.ext = ext;
          nf.path = path;
  
          return nf;
      }
  }
  </code></pre>
  
  <p>This is nested inside an if statement that is in a static class' constructor function and the static class is in a public class that extends ListActivity. I'm new to Java.</p>
  
  <p>Error:</p>
  
  <pre><code>05-01 20:21:58.810: E/AndroidRuntime(584): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
  05-01 20:21:58.830: E/AndroidRuntime(584): java.lang.RuntimeException: An error occured while executing doInBackground()
  05-01 20:21:58.830: E/AndroidRuntime(584):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at java.lang.Thread.run(Thread.java:1096)
  05-01 20:21:58.830: E/AndroidRuntime(584): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
  05-01 20:21:58.830: E/AndroidRuntime(584):  at android.os.Handler.&lt;init&gt;(Handler.java:121)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at greg.projects.FileTransfer.FileTransferActivity$NamedFile$1.&lt;init&gt;(FileTransferActivity.java:588)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at greg.projects.FileTransfer.FileTransferActivity$NamedFile.&lt;init&gt;(FileTransferActivity.java:588)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at greg.projects.FileTransfer.FileTransferActivity$GesturesLoadTask.doInBackground(FileTransferActivity.java:489)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at greg.projects.FileTransfer.FileTransferActivity$GesturesLoadTask.doInBackground(FileTransferActivity.java:1)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
  05-01 20:21:58.830: E/AndroidRuntime(584):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
  05-01 20:21:58.830: E/AndroidRuntime(584):  ... 4 more
  </code></pre>
  
  <p>(FileTransferActivity.java:588 is <code>final Handler handler = new Handler() {</code>)</p>