簡體   English   中英

如何在Android中分別顯示openweather地圖數據?

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

我正在嘗試學習Android異步和json數據解析。 我正在使用openweathermap.org API來顯示地點用戶類型的當前天氣。 我的應用程序顯示了它,但是它不靈活,因為它在一個字符串中顯示所有不同的詳細信息,例如天氣描述,緯度,經度,風速,當前溫度等,因此我們不能重復使用它。 假設如果我想用地圖標記在當前溫度下在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();
        }
    }
}

這段代碼可以運行並輸出當前天氣,但是由於所有內容都被連接到單個字符串中,因此它不可重用。

為了使其可重用且易於訪問,可以根據需要創建一個包含這些屬性的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 weather);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM