title: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
body: <p>I am using the following <code>MainActivity</code>, and I am still getting the following error message:</p>
  
  <pre><code>Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
  at android.os.Handler.&lt;init&gt;(Handler.java:200)
  at android.os.Handler.&lt;init&gt;(Handler.java:114)
  at android.widget.Toast$TN.&lt;init&gt;(Toast.java:344)
  at android.widget.Toast.&lt;init&gt;(Toast.java:100)
  at android.widget.Toast.makeText(Toast.java:258)
  at com.example.edtomach.whatstheweather.MainActivity$DownloadTask.doInBackground(MainActivity.java:114)
  at com.example.edtomach.whatstheweather.MainActivity$DownloadTask.doInBackground(MainActivity.java:80)
  </code></pre>
  
  <p>Why am I getting this error? The relevant code is here:</p>
  
  <pre><code>public class MainActivity extends Activity {
      EditText cityname;
      TextView resulttextview;
  
      public void findWeather(View view) {
          Log.i("cityname", cityname.getText().toString());
  
          InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
          mgr.hideSoftInputFromWindow(cityname.getWindowToken(), 0);
  
          try {
              String encodedCityName = URLEncoder.encode(cityname.getText().toString(), "UTF-8");
  
              DownloadTask task = new DownloadTask();
              task.execute("http://api.openweathermap.org/data/2.5/weather?q=" + encodedCityName);
          } catch (UnsupportedEncodingException e) {
              e.printStackTrace();
  
              Toast.makeText(getApplicationContext(), "could not find weather", Toast.LENGTH_LONG).show();
          }
      }
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
  
          cityname = (EditText) findViewById(R.id.cityname);
          resulttextview = (TextView) findViewById(R.id.resulttextview);
      }
  
      public class DownloadTask extends AsyncTask&lt;String, Void, String&gt; {
          @Override
          protected String doInBackground(String... urls) {
              String result = "";
              URL url;
              HttpURLConnection urlConnection = null;
              try {
                  url = new URL(urls[0]);
                  urlConnection = (HttpURLConnection) url.openConnection();
                  InputStream in = urlConnection.getInputStream();
                  InputStreamReader reader = new InputStreamReader(in);
                  int data = reader.read();
  
                  while (data != -1) {
                      char current = (char) data;
                      result += current;
                      data = reader.read();
                  }
  
                  return result;
              } catch (Exception e) {
                  Toast.makeText(getApplicationContext(), "could not find weather", Toast.LENGTH_LONG).show();
              }
  
              return null;
          }
  
          @Override
          protected void onPostExecute(String result) {
              super.onPostExecute(result);
  
              try {
                  String message = "";
                  JSONObject jsonObject = new JSONObject(result);
  
                  String weatherInfo = jsonObject.getString("weather");
                  Log.i("Weather content", weatherInfo);
  
                  JSONArray arr = new JSONArray(weatherInfo);
  
                  for (int i = 0; i &lt; arr.length(); i++) {
                      JSONObject jsonPart = arr.getJSONObject(i);
  
                      String main = "";
                      String description = "";
  
                      main = jsonPart.getString("main");
                      description = jsonPart.getString("description");
  
                      if (main != "" &amp;&amp; description != "") {
                          message += main + ": " + description + "\r\n";
                      }
                  }
  
                  if (message != "") {
                      resulttextview.setText(message);
                  } else {
                      Toast.makeText(getApplicationContext(), "could not find weather", Toast.LENGTH_LONG).show();
                  }
              } catch (JSONException e) {
                  Toast.makeText(getApplicationContext(), "could not find weather", Toast.LENGTH_LONG).show();
              }
          }
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.menu_main, menu);
          return true;
      }
  
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          // Handle action bar item clicks here. The action bar will
          // automatically handle clicks on the Home/Up button, so long
          // as you specify a parent activity in AndroidManifest.xml.
          int id = item.getItemId();
  
          //noinspection SimplifiableIfStatement
          if (id == R.id.action_settings) {
              return true;
          }
  
          return super.onOptionsItemSelected(item);
      }
  }
  </code></pre>