简体   繁体   English

如何在Android中分别显示openweather地图数据?

[英]How to display openweather map data separately in Android?

I am trying to learn Android Async and json data parsing. 我正在尝试学习Android异步和json数据解析。 I am using openweathermap.org API for displaying current weather for a place user type. 我正在使用openweathermap.org API来显示地点用户类型的当前天气。 My application displayed it However, it is not flexible as it is displaying all different details such as weather description, latitude, longitude, Wind Speed , current temperature.. all in a single string so it is not reusable which we should make. 我的应用程序显示了它,但是它不灵活,因为它在一个字符串中显示所有不同的详细信息,例如天气描述,纬度,经度,风速,当前温度等,因此我们不能重复使用它。 Suppose if i want to display the place on google map with current temperature with a map marker, I should be able to get only what i want in this case current temperature and latitude and longitude. 假设如果我想用地图标记在当前温度下在Google地图上显示该地点,那么在这种情况下,我应该只能获取我想要的当前温度以及纬度和经度。 I want these details to display on separate textfields. 我希望这些详细信息显示在单独的文本字段中。 I am beginner in Android. 我是Android的初学者。 Please look into my code and suggest me with a solution and guidance. 请查看我的代码,并为我提供解决方案和指导。

Here is my JSONWeatherData.java 这是我的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;
    }
}

Main Activity 主要活动

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();
        }
    }
}

This code runs and output current weather but its not reusuable because everything is concatenated to single string. 这段代码可以运行并输出当前天气,但是由于所有内容都被连接到单个字符串中,因此它不可重用。

To make it reusable and easy to access to each attribute as you want, how about making a class Weather that contains those attribute and when you start parsing the json, make an instance of it and write them there. 为了使其可重用且易于访问,可以根据需要创建一个包含这些属性的Weather类,并在开始解析json时创建它的一个实例并将其写入其中。

For example, instead of just this: 例如,不仅如此:

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

change to sth like: 改成……

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

Remember to change return type onPostExcute(String string) into onPostExcute(Weather weather); 记住将返回类型onPostExcute(String string)更改为onPostExcute(Weather weather);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM