java 阳光网络2
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 阳光网络2相关的知识,希望对你有一定的参考价值。
package com.example.android.sunshine.utilities;
import android.content.ContentValues;
import android.content.Context;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.net.HttpURLConnection;
/**
* Utility functions to handle OpenWeatherMap JSON data.
*/
public final class OpenWeatherJsonUtils {
/**
* This method parses JSON from a web response and returns an array of Strings
* describing the weather over various days from the forecast.
* <p/>
* Later on, we'll be parsing the JSON into structured data within the
* getFullWeatherDataFromJson function, leveraging the data we have stored in the JSON. For
* now, we just convert the JSON into human-readable strings.
*
* @param forecastJsonStr JSON response from server
*
* @return Array of Strings describing weather data
*
* @throws JSONException If JSON data cannot be properly parsed
*/
public static String[] getSimpleWeatherStringsFromJson(Context context, String forecastJsonStr)
throws JSONException {
/* Weather information. Each day's forecast info is an element of the "list" array */
final String OWM_LIST = "list";
/* All temperatures are children of the "temp" object */
final String OWM_TEMPERATURE = "temp";
/* Max temperature for the day */
final String OWM_MAX = "max";
final String OWM_MIN = "min";
final String OWM_WEATHER = "weather";
final String OWM_DESCRIPTION = "main";
final String OWM_MESSAGE_CODE = "cod";
/* String array to hold each day's weather String */
String[] parsedWeatherData = null;
JSONObject forecastJson = new JSONObject(forecastJsonStr);
/* Is there an error? */
if (forecastJson.has(OWM_MESSAGE_CODE)) {
int errorCode = forecastJson.getInt(OWM_MESSAGE_CODE);
switch (errorCode) {
case HttpURLConnection.HTTP_OK:
break;
case HttpURLConnection.HTTP_NOT_FOUND:
/* Location invalid */
return null;
default:
/* Server probably down */
return null;
}
}
JSONArray weatherArray = forecastJson.getJSONArray(OWM_LIST);
parsedWeatherData = new String[weatherArray.length()];
long localDate = System.currentTimeMillis();
long utcDate = SunshineDateUtils.getUTCDateFromLocal(localDate);
long startDay = SunshineDateUtils.normalizeDate(utcDate);
for (int i = 0; i < weatherArray.length(); i++) {
String date;
String highAndLow;
/* These are the values that will be collected */
long dateTimeMillis;
double high;
double low;
String description;
/* Get the JSON object representing the day */
JSONObject dayForecast = weatherArray.getJSONObject(i);
/*
* We ignore all the datetime values embedded in the JSON and assume that
* the values are returned in-order by day (which is not guaranteed to be correct).
*/
dateTimeMillis = startDay + SunshineDateUtils.DAY_IN_MILLIS * i;
date = SunshineDateUtils.getFriendlyDateString(context, dateTimeMillis, false);
/*
* Description is in a child array called "weather", which is 1 element long.
* That element also contains a weather code.
*/
JSONObject weatherObject =
dayForecast.getJSONArray(OWM_WEATHER).getJSONObject(0);
description = weatherObject.getString(OWM_DESCRIPTION);
/*
* Temperatures are sent by Open Weather Map in a child object called "temp".
*
* Editor's Note: Try not to name variables "temp" when working with temperature.
* It confuses everybody. Temp could easily mean any number of things, including
* temperature, temporary and is just a bad variable name.
*/
JSONObject temperatureObject = dayForecast.getJSONObject(OWM_TEMPERATURE);
high = temperatureObject.getDouble(OWM_MAX);
low = temperatureObject.getDouble(OWM_MIN);
highAndLow = SunshineWeatherUtils.formatHighLows(context, high, low);
parsedWeatherData[i] = date + " - " + description + " - " + highAndLow;
}
return parsedWeatherData;
}
/**
* Parse the JSON and convert it into ContentValues that can be inserted into our database.
*
* @param context An application context, such as a service or activity context.
* @param forecastJsonStr The JSON to parse into ContentValues.
*
* @return An array of ContentValues parsed from the JSON.
*/
public static ContentValues[] getFullWeatherDataFromJson(Context context, String forecastJsonStr) {
/** This will be implemented in a future lesson **/
return null;
}
}
package com.example.android.sunshine.utilities;
import android.net.Uri;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
/**
* These utilities will be used to communicate with the weather servers.
*/
public final class NetworkUtils {
private static final String TAG = NetworkUtils.class.getSimpleName();
private static final String DYNAMIC_WEATHER_URL =
"https://andfun-weather.udacity.com/weather";
private static final String STATIC_WEATHER_URL =
"https://andfun-weather.udacity.com/staticweather";
private static final String FORECAST_BASE_URL = STATIC_WEATHER_URL;
/*
* NOTE: These values only effect responses from OpenWeatherMap, NOT from the fake weather
* server. They are simply here to allow us to teach you how to build a URL if you were to use
* a real API.If you want to connect your app to OpenWeatherMap's API, feel free to! However,
* we are not going to show you how to do so in this course.
*/
/* The format we want our API to return */
private static final String format = "json";
/* The units we want our API to return */
private static final String units = "metric";
/* The number of days we want our API to return */
private static final int numDays = 14;
final static String QUERY_PARAM = "q";
final static String LAT_PARAM = "lat";
final static String LON_PARAM = "lon";
final static String FORMAT_PARAM = "mode";
final static String UNITS_PARAM = "units";
final static String DAYS_PARAM = "cnt";
/**
* Builds the URL used to talk to the weather server using a location. This location is based
* on the query capabilities of the weather provider that we are using.
*
* @param locationQuery The location that will be queried for.
* @return The URL to use to query the weather server.
*/
public static URL buildUrl(String locationQuery) {
// COMPLETED (1) Fix this method to return the URL used to query Open Weather Map's API
Uri builtUri = Uri.parse(FORECAST_BASE_URL).buildUpon()
.appendQueryParameter(QUERY_PARAM, locationQuery)
.appendQueryParameter(FORMAT_PARAM, format)
.appendQueryParameter(UNITS_PARAM, units)
.appendQueryParameter(DAYS_PARAM, Integer.toString(numDays))
.build();
URL url = null;
try {
url = new URL(builtUri.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
Log.v(TAG, "Built URI " + url);
return url;
}
/**
* Builds the URL used to talk to the weather server using latitude and longitude of a
* location.
*
* @param lat The latitude of the location
* @param lon The longitude of the location
* @return The Url to use to query the weather server.
*/
public static URL buildUrl(Double lat, Double lon) {
/** This will be implemented in a future lesson **/
return null;
}
/**
* This method returns the entire result from the HTTP response.
*
* @param url The URL to fetch the HTTP response from.
* @return The contents of the HTTP response.
* @throws IOException Related to network and stream reading
*/
public static String getResponseFromHttpUrl(URL url) throws IOException {
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = urlConnection.getInputStream();
Scanner scanner = new Scanner(in);
scanner.useDelimiter("\\A");
boolean hasInput = scanner.hasNext();
if (hasInput) {
return scanner.next();
} else {
return null;
}
} finally {
urlConnection.disconnect();
}
}
}
package com.example.android.sunshine;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import com.example.android.sunshine.data.SunshinePreferences;
import com.example.android.sunshine.utilities.NetworkUtils;
import com.example.android.sunshine.utilities.OpenWeatherJsonUtils;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private TextView mWeatherTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_forecast);
/*
* Using findViewById, we get a reference to our TextView from xml. This allows us to
* do things like set the text of the TextView.
*/
mWeatherTextView = (TextView) findViewById(R.id.tv_weather_data);
/* Once all of our views are setup, we can load the weather data. */
loadWeatherData();
}
// COMPLETED (8) Create a method that will get the user's preferred location and execute your new AsyncTask and call it loadWeatherData
/**
* This method will get the user's preferred location for weather, and then tell some
* background method to get the weather data in the background.
*/
private void loadWeatherData() {
String location = SunshinePreferences.getPreferredWeatherLocation(this);
new FetchWeatherTask().execute(location);
}
public class FetchWeatherTask extends AsyncTask<String, Void, String[]> {
@Override
protected String[] doInBackground(String... params) {
/* If there's no zip code, there's nothing to look up. */
if (params.length == 0) {
return null;
}
String location = params[0];
URL weatherRequestUrl = NetworkUtils.buildUrl(location);
try {
String jsonWeatherResponse = NetworkUtils
.getResponseFromHttpUrl(weatherRequestUrl);
String[] simpleJsonWeatherData = OpenWeatherJsonUtils
.getSimpleWeatherStringsFromJson(MainActivity.this, jsonWeatherResponse);
return simpleJsonWeatherData;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(String[] weatherData) {
if (weatherData != null) {
/*
* Iterate through the array and append the Strings to the TextView. The reason why we add
* the "\n\n\n" after the String is to give visual separation between each String in the
* TextView. Later, we'll learn about a better way to display lists of data.
*/
for (String weatherString : weatherData) {
mWeatherTextView.append((weatherString) + "\n\n\n");
}
}
}
}
}
以上是关于java 阳光网络2的主要内容,如果未能解决你的问题,请参考以下文章