Как отображать данные карты openweather отдельно в Android?

Я пытаюсь изучить анализ данных Android Async и json. Я использую API openweathermap.org для отображения текущей погоды для типа пользователя места. Мое приложение отображало его. Однако оно не является гибким, поскольку отображает все различные детали, такие как описание погоды, широта, долгота, скорость ветра, текущая температура ... все в одной строке, поэтому его нельзя использовать повторно, что мы должны сделать. Предположим, если я хочу отобразить место на карте Google с текущей температурой с помощью маркера карты, я смогу получить только то, что хочу, в этом случае текущую температуру, широту и долготу. Я хочу, чтобы эти данные отображались в отдельных текстовых полях. Я новичок в Android. Пожалуйста, изучите мой код и предложите мне решение и руководство.

Вот мой JSONWeatherData.java

public class JSONWeatherData {
    public static String getData(String weatherJson) throws JSONException {
        String jsonResult = "";
        try {
            JSONObject JsonObject = new JSONObject(weatherJson);
            String cod = jsonHelperGetString(JsonObject, "cod");
            if(cod != null) {
                if (cod.equals("200")) {
                    jsonResult += jsonHelperGetString(JsonObject, "name") + "\n";
                    JSONObject sys = jsonHelperGetJSONObject(JsonObject, "sys");
                    if (sys != null) {
                        jsonResult += jsonHelperGetString(sys, "country") + "\n";
                    }
                    jsonResult += "\n";
                    JSONObject coord = jsonHelperGetJSONObject(JsonObject, "coord");
                    if(coord != null){
                        String lon = jsonHelperGetString(coord, "lon");
                        String lat = jsonHelperGetString(coord, "lat");
                        jsonResult += "Lon: " + lon + "\n";
                        jsonResult += "Lat: " + lat + "\n";
                    }
                    jsonResult += "\n";
                    JSONArray weather = jsonHelperGetJSONArray(JsonObject, "weather");
                    if(weather != null){
                        for(int i=0; i<weather.length(); i++){
                            JSONObject thisWeather = weather.getJSONObject(i);
                            jsonResult += "Weather " + i + ":\n";
                            jsonResult += jsonHelperGetString(thisWeather, "main") + "\n";
                            jsonResult += jsonHelperGetString(thisWeather, "description") + "\n";
                            jsonResult += "\n";
                        }
                    }
                    JSONObject main = jsonHelperGetJSONObject(JsonObject, "main");
                    if(main != null){
                        jsonResult += "temp: " + jsonHelperGetString(main, "temp") + "\n";
                        jsonResult += "\n";
                    }
                    JSONObject wind = jsonHelperGetJSONObject(JsonObject, "wind");
                    if(wind != null){
                        jsonResult += "Wind Speed: " + jsonHelperGetString(wind, "speed") + "\n";
                        jsonResult += "\n";
                    }
                }
                else if(cod.equals("404")){
                    String message = jsonHelperGetString(JsonObject, "message");
                    jsonResult += "cod 404: " + message;
                }
            } else{
                jsonResult += "cod == null\n";
            }
        } catch (JSONException e) {
            e.printStackTrace();
            Log.e(TAG, e.getMessage(), e);
            jsonResult += e.getMessage();
        }
        return jsonResult;
    }
    private static String jsonHelperGetString(JSONObject obj, String k){
        String v = null;
        try {
            v = obj.getString(k);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return v;
    }
    private static JSONObject jsonHelperGetJSONObject(JSONObject obj, String k){
        JSONObject o = null;
        try {
            o = obj.getJSONObject(k);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return o;
    }
    private static JSONArray jsonHelperGetJSONArray(JSONObject obj, String k){
        JSONArray a = null;
        try {
            a = obj.getJSONArray(k);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return a;
    }
}

Основная деятельность

Public class MainActivity extends Activity {
    Button btnSubmitCity, btnMap;
    EditText editCityText;
    TextView weather_description, current_temp, wind_speed, textViewResult;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editCityText = (EditText) findViewById(R.id.editCity);
        btnMap =(Button) findViewById(R.id.mapButton);
        btnSubmitCity = (Button) findViewById(R.id.submitCity);
        weather_description = (TextView) findViewById(R.id.weatherDescription);
        current_temp = (TextView) findViewById(R.id.currentTemp);
        wind_speed = (TextView) findViewById(R.id.windSpeed);
        //textViewResult = (TextView)findViewById(R.id.result);
        textViewResult = (TextView)findViewById(R.id.result);
        btnMap.setVisibility(View.INVISIBLE);
        btnMap.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });
        btnSubmitCity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //editCityText.getText().toString();
                //HttpGetTask
                String cityString = editCityText.getText().toString();
                if(TextUtils.isEmpty(cityString)) {
                    Toast.makeText(MainActivity.this, "Enter a place", Toast.LENGTH_LONG).show();
                    return;
                } else{
                    new HttpGetTask(cityString, weather_description).execute(cityString);
                    btnMap.setVisibility(View.VISIBLE);
                }
                //String cityString = city.getText().toString();
                //new HttpGetTask().execute();
                /*
                  new HttpGetTask(
                        editCityText.getText().toString(),
                        textViewResult).execute();
                 */
            }
        });
    }
    private class HttpGetTask extends AsyncTask<String, Void, String> {
        final String FORECAST_BASE_URL = "http://api.openweathermap.org/data/2.5/weather?";
        private static final String TAG = "HttpGetTask";
        String cityName;
        TextView tvResult;
        HttpGetTask(String cityName, TextView tvResult){
            this.cityName = cityName;
            this.tvResult = tvResult;
        }
        @Override
        protected String doInBackground(String... params){
            InputStream in = null;
            HttpURLConnection httpUrlConnection = null;
            String result = "";
            try {
                Uri builtUri = Uri.parse(FORECAST_BASE_URL).buildUpon()
                        .appendQueryParameter("q", cityName+",us") // city
                        .appendQueryParameter("mode", "json") // json format as result
                        .appendQueryParameter("units", "imperial") // metric unit
                        .appendQueryParameter("APPID", "Replace with your openweathermap API ID")
                        .build();
                URL url = new URL(builtUri.toString());
                httpUrlConnection = (HttpURLConnection) url.openConnection();
                in = new BufferedInputStream(
                        httpUrlConnection.getInputStream());
                String data = readStream(in);
                result = edu.uco.rawal.p6rabina.JSONWeatherData.getData(data);
            } catch (MalformedURLException exception) {
                Log.e(TAG, "MalformedURLException");
            } catch (IOException exception) {
                Log.e(TAG, "IOException");
            } catch (JSONException e) {
                Log.e(TAG, e.getMessage(), e);
                e.printStackTrace();
            } finally {
                if (null != httpUrlConnection) {
                    httpUrlConnection.disconnect();
                }
                if (in != null) {
                    try {
                        in.close();
                    } catch (final IOException e) {
                        Log.e(TAG, "Error closing stream", e);
                    }
                }
        }
            return result;
        }
        @Override
        protected void onPostExecute(String result) {
            if (result == null || result == "") {
                Toast.makeText(MainActivity.this,
                        "Invalid weather data. Possibly a wrong query",
                        Toast.LENGTH_SHORT).show();
                return;
            } else {
                //btnMap.setVisibility(View.VISIBLE);
                tvResult.setText(result);
            }

        }
        private String readStream(InputStream in) {
            BufferedReader reader = null;
            StringBuffer data = new StringBuffer("");
            try {
                reader = new BufferedReader(new InputStreamReader(in));
                String line ;
                while ((line = reader.readLine()) != null) {
                    data.append(line);
                }
            } catch (IOException e) {
                Log.e(TAG, "IOException");
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return data.toString();
        }
    }
}

Этот код запускается и выводит текущую погоду, но его нельзя использовать повторно, потому что все объединяется в одну строку.


person robinleathal    schedule 11.10.2016    source источник


Ответы (1)


Чтобы сделать его многоразовым и простым для доступа к каждому атрибуту, как вы хотите, как насчет создания класса Weather, который содержит эти атрибуты, и когда вы начнете анализировать json, создайте его экземпляр и напишите их там.

Например, вместо этого:

String lon = jsonHelperGetString(coord, "lon");
String lat = jsonHelperGetString(coord, "lat");
jsonResult += "Lon: " + lon + "\n";
jsonResult += "Lat: " + lat + "\n";
...

изменить на что-то вроде:

Weather aWeather = new Weather();
String lon = jsonHelperGetString(coord, "lon");
String lat = jsonHelperGetString(coord, "lat");
aWeather.lon = long;
aWeather.lat = lat;
...
return aWeather;

Не забудьте изменить тип возвращаемого значения onPostExcute (String string) на onPostExcute (погода Weather);

person Trung Le    schedule 11.10.2016
comment
Как насчет частного класса HttpGetTask, расширяющего AsyncTask‹String, Void, String›. Мне нужно изменить его? Не могли бы вы уточнить немного подробнее. У меня ограниченные знания, так как я только учусь последние 2-3 недели. - person robinleathal; 13.10.2016
comment
Я не могу объяснить все, но постараюсь рассказать вам самое интересное: HttpGetTask extends AsyncTask‹String, Void, Weather› { Override protected Weather doInBackground(Void... params) { // Обрабатываем синтаксический анализ и возвращаем Weather вместо объекта } Override protected void onPostExecute(Weather response) { // теперь вы можете манипулировать информацией из ответа здесь } } // Извините за неправильный формат, в основном вам нужно настроить тип возвращаемого значения с AsyncTask (3-й параметр) на AsyncTask‹ Строка, Пустота, Погода› - person Trung Le; 13.10.2016