2017-02-10 1 views
0

Ich habe vor kurzem begonnen, JSON für die Verwendung in meinen Apps zu lernen. Ich habe eine Wetter-API (openweathermap.org) gefunden und in meiner App verwendet. Die App läuft gut, aber wenn ich Button drücke, passiert nichts. Mein Quellcode:Meine App fügt keine Wetterinformationen zu TextView (JSON) hinzu

import android.content.Context; 
import android.hardware.input.InputManager; 
import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import java.io.*; 
import java.net.*; 
import java.util.*; 
import android.util.*; 
import android.view.*; 
import android.view.inputmethod.InputMethodManager; 
import android.widget.*; 
import org.json.*; 


public class MainActivity extends AppCompatActivity { 

    EditText city; 
    TextView weather, description; 

    DownloadTask DownloadTask; 
    public void showWeather (View view) 
    { 
     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(city.getWindowToken(), 0); 

     try 
     { 
      String encodedCityName = URLEncoder.encode(city.getText().toString(), "UTF-8"); 
      DownloadTask = new DownloadTask(); 
      DownloadTask.execute("http://api.openweathermap.org/data/2.5/weather?q=" + encodedCityName + "&appid=812f300ec742971975bbde9a2e0ac0c1"); 
     } 
     catch (UnsupportedEncodingException e) 
     { 
      e.printStackTrace(); 
      Toast.makeText(getApplicationContext(), "Error!", Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     city = (EditText) findViewById(R.id.city); 
     weather = (TextView) findViewById(R.id.weather); 
     description = (TextView) findViewById(R.id.description); 
    } 

    public class DownloadTask extends AsyncTask<String, Void, String> 
    { 
     @Override 
     protected String doInBackground(String... urls) { 
      String result = ""; 
      URL url; 
      HttpURLConnection connection = null; 

      try 
      { 
       url = new URL(urls[0]); 
       connection = (HttpURLConnection) url.openConnection(); 

       InputStream in = connection.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) 
      { 
       e.printStackTrace(); 
       Toast.makeText(getApplicationContext(), "Error!", Toast.LENGTH_LONG); 

      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 

      super.onPostExecute(result); 
      Log.i("Weather content", result); 
      try 
      { 
       JSONObject jsonObject = new JSONObject(result); 
       String weatherInfo = jsonObject.getString("weather"); 
       Log.i("Weather Content", weatherInfo); 

       JSONArray jsonArray = new JSONArray(weatherInfo); 

       String getMain = ""; 
       String getDescription = ""; 

       for (int i = 0; i < jsonArray.length(); i++) 
       { 
        JSONObject jsonPart = jsonArray.getJSONObject(i); 

        getMain = jsonPart.getString("main"); 
        getDescription = jsonPart.getString("description"); 

        Log.i("Main", getMain); 

       } 
       if (getMain != "" && getDescription != "") 
       { 
        weather.setText(getMain); 
        description.setText(getDescription); 
       } 
      } 
      catch (JSONException e) 
      { 
       e.printStackTrace(); 
       Toast.makeText(getApplicationContext(), "Error!", Toast.LENGTH_LONG); 
      } 
     } 
    } 

} 

keine Toasts und Logs funktionieren.

+0

'! GetMain.isEmpty() &&! GetDescription.isEmpty()' –

+0

@PavneetSingh Dank aber nicht –

+0

haben Sie gearbeitet haben einige Debug zu tun, entweder Dort sollte "Error!" angezeigt werden, und wenn nicht, stelle sicher, dass deine Aufgabe ausgeführt wird und überprüfe den Wert von 'Weather content' log und stelle sicher, dass du Erlaubnis und Laufzeitberechtigung für Marshmallow und über –

Antwort

0

Sie haben einen Fehler beim Lesen der Daten. Sie sollten aufhören zu lesen, wenn immer -1 nicht 1.

  while (data != -1) 
      { 
       char current = (char) data; 
       result += current; 

       data = reader.read(); 
      } 
+0

'lesen' Funktion Dokumentation: https://docs.oracle.com/javase/7/docs/api/java/io/InputStreamReader.html#read() – zed

+0

Ich benutze immer das, um Daten zu lesen, und es funktioniert. das ist nicht das Problem –

+0

Und um sicherzustellen, log 'Ergebnis';) – zed

Verwandte Themen