从世界天气在线API数据显示 [英] Show data from world weather online api

查看:286
本文介绍了从世界天气在线API数据显示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用世界天气在线API开发应用程序的天气
 对于android.How我显示应用程序数据?数据在logcat.Following显示是我的code。

I am developing weather application by using world weather online API for android.How i show data in application? data is showing in logcat.Following is my code.

MainActivity.java

公共类MainActivity扩展ListActivity {

public class MainActivity extends ListActivity {

private ProgressDialog pDialog;

// URL to get contacts JSON
private static String url = "http://api.worldweatheronline.com/free/v1/weather.ashx?q=";

// JSON Node names
private static final String TAG_DATA = "data";
private static final String TAG_NAME = "name";
// contacts JSONArray
JSONArray data = null;

// Hashmap for ListView
ArrayList<HashMap<String, String>> dataList;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    dataList = new ArrayList<HashMap<String, String>>();

    ListView lv = getListView();

    new GetContacts().execute();
}

/**
 * Async task class to get json by making HTTP call
 * */
private class GetContacts extends AsyncTask<Void, Void, Void> {

    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
        pDialog.show();

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // Creating service handler class instance
        ServiceHandler sh = new ServiceHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

        Log.d("Response: ", "> " + jsonStr);

        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);

                // Getting JSON Array node
                data = jsonObj.getJSONArray(TAG_DATA);

                // looping through All Contacts
                for (int i = 0; i < data.length(); i++) {
                    JSONObject c = data.getJSONObject(i);



                    // tmp hashmap for single contact
                    HashMap<String, String> contact = new HashMap<String, String>();

                    // adding each child node to HashMap key => value


                    // adding contact to contact list
                    dataList.add(contact);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if (pDialog.isShowing())
            pDialog.dismiss();
        /**
         * Updating parsed JSON data into ListView
         * */
        ListAdapter adapter = new SimpleAdapter(MainActivity.this,
                dataList, R.layout.list_item, new String[] { TAG_NAME }, new int[] {
                        R.id.name });

        setListAdapter(adapter);
    }

}

}

ServiceHandler.java

公共类的ServiceHandler {

public class ServiceHandler {

static String response = null;
public final static int GET = 1;
public final static int POST = 2;

public ServiceHandler() {

}

/**
 * Making service call
 * @url - url to make request
 * @method - http request method
 * */
public String makeServiceCall(String url, int method) {
    return this.makeServiceCall(url, method, null);
}

/**
 * Making service call
 * @url - url to make request
 * @method - http request method
 * @params - http request params
 * */
public String makeServiceCall(String url, int method,
        List<NameValuePair> params) {
    try {
        // http client
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpEntity httpEntity = null;
        HttpResponse httpResponse = null;

        // Checking http request method type
        if (method == POST) {
            HttpPost httpPost = new HttpPost(url);
            // adding post params
            if (params != null) {
                httpPost.setEntity(new UrlEncodedFormEntity(params));
            }

            httpResponse = httpClient.execute(httpPost);

        } else if (method == GET) {
            // appending params to url
            if (params != null) {
                String paramString = URLEncodedUtils
                        .format(params, "utf-8");
                url += "?" + paramString;
            }
            HttpGet httpGet = new HttpGet(url);

            httpResponse = httpClient.execute(httpGet);

        }
        httpEntity = httpResponse.getEntity();
        response = EntityUtils.toString(httpEntity);

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return response;

}

}

推荐答案

首先,这种格式将参考V1免费版本。世界天气网上已经发布了V2,这是卓越的。我是在更新的过程中,看到了这个问题,坐在那里,所以我会根据过什么,我有这样的工作做了回答。

First of all, this format will refer to the V1 free version. World Weather Online has released v2, which is superior. I was in the process of updating and saw this question sitting out there so I'll answer based off of what I had that did work.

您要使用的AsyncTask在正确的轨道上,这是我调用AsyncTask的。你应该知道我用我的数据点类仅包含来自WWO,我需要使用的数据。根据你的问题,你也可以说我将放在数据点对象反正你认为合适的屏幕上,因为在queryWeatherService()的结尾,你会最终有一个分析数据集的数据。

You are on the right track to use the AsyncTask, here is my call to AsyncTask. You should know I use my "DataPoint" class to simply contain the data from WWO that I need to use. Based on your question, you can show the data that I will put in the DataPoint object in anyway you see fit on the screen, since at the end of the queryWeatherService(), you will end up with a parsed set of data.

//Some call to query the weather, which executes the AsyncTask
private DataPoint queryWeatherService()
{       
        // This method will retrieve the data from the weather service
        DataPoint newDataPoint = new DataPoint();
        if (!waiting)
            {
            try{
                newDataPoint = new WeatherServiceClass().execute(
                String.valueOf(getlatitude()),  //Not shown here: pass in some String of a float value of of your lat coordinate.
                String.valueOf(getlongitude())) //Not shown here: pass in some String of a float value of of your long coordinate.
                                .get();
                    } catch (InterruptedException | ExecutionException e)
                    {
                        e.printStackTrace();
                    }
            }
        return newDataPoint;
        // Documentation:
        // https://developer.worldweatheronline.com/page/documentation
    }

这扩展了AsyncTask的的WeatherServiceClass

The WeatherServiceClass that extends the AsyncTask

public class WeatherServiceClass extends AsyncTask<String, String, DataPoint> {
    private String latitude;
    private String longitude;

    public WeatherServiceClass() {
    }

    @Override
    protected DataPoint doInBackground(String... params) {
        DataPoint dp = new DataPoint();
        JSONWeatherParser jparser = new JSONWeatherParser();
        latitude = params[0];
        longitude = params[1];
        String data = ((new WeatherHttpClient().getWeatherData(latitude, longitude)));
        try {
            dp = jparser.getWeather(data);

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return dp;
        //Reference:
        // http://www.javacodegeeks.com/2013/06/android-build-real-weather-app-json-http-and-openweathermap.html
    } 
}

下面是WeatherHttpClient类:

Here is the WeatherHttpClient class:

public class WeatherHttpClient {

    private static String BASE_URL = "http://api.worldweatheronline.com/free/v1/weather.ashx?q=";
    private static String BASE_URL_PT2 = "&format=json&num_of_days=5&date=today&key=[ENTER YOUR KEY HERE, I'M NOT GIVING YOU MINE]";

    public String getWeatherData(String latitude, String longitude){
        HttpURLConnection con = null;
        InputStream is=null;

        try{
            con = (HttpURLConnection)(new URL(BASE_URL + latitude+","+longitude+BASE_URL_PT2)).openConnection();
            con.setRequestMethod("GET");
            con.setDoInput(true);
            con.setDoOutput(true);
            con.connect();

            //Reading the response
            StringBuffer buffer = new StringBuffer();
            is = con.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line = null;
            while ((line=br.readLine()) != null)
                buffer.append(line + "\r\n");
            is.close();
            con.disconnect();
            return buffer.toString();
        }
        catch(Throwable t) {
            t.printStackTrace();
        }
        finally {
            try { is.close();} catch(Throwable t){}
            try { con.disconnect();} catch(Throwable t){}
        }

        return null;
    }

最后,这里是我的JSONWeatherParser:

Finally, here is my JSONWeatherParser:

public class JSONWeatherParser {

    public JSONWeatherParser() {

    }

    public DataPoint getWeather(String data) throws JSONException {
        DataPoint dp = new DataPoint();
        Weather weather = new Weather();   //This is just a class that has a bunch of strings in it for the weather info.
        JSONObject jObj = new JSONObject(data);

        //Parsing JSON data
        JSONObject dObj = jObj.getJSONObject("data");
        JSONArray cArr = dObj.getJSONArray("current_condition");
        JSONObject JSONCurrent = cArr.getJSONObject(0);
        weather.setCurrent_temp(getString("temp_F",JSONCurrent));
        weather.setHour(getString("observation_time",JSONCurrent));
        JSONArray jArr = dObj.getJSONArray("weather");
        JSONObject JSONWeather = jArr.getJSONObject(0);
        JSONArray jArrIcon = JSONWeather.getJSONArray("weatherIconUrl");
        JSONObject JSONIcon = jArrIcon.getJSONObject(0);
        weather.setDate(getString("date",JSONWeather));
        weather.setPrecipmm(getString("precipMM",JSONWeather));
        weather.setTempMaxc(getString("tempMaxC",JSONWeather));
        weather.setTempMaxf(getString("tempMaxF",JSONWeather));
        weather.setTempMinf(getString("tempMinF",JSONWeather));
        weather.setTempMinc(getString("tempMinC",JSONWeather));
        weather.setWeatherCode(getString("weatherCode",JSONWeather));
        weather.setWeatherIconURL(getString("value",JSONIcon));
        weather.setWinddir16point(getString("winddir16Point",JSONWeather));
        weather.setWinddirDegree(getString("winddirDegree",JSONWeather));
        weather.setWindspeedKmph(getString("windspeedKmph",JSONWeather));
        weather.setWindspeedMiles(getString("windspeedMiles",JSONWeather));
        dp.setWeather(weather); //assigns and converts the relevant weather strings to DataPoint
        // For details of these operations and how each works go here:
        // http://www.javacodegeeks.com/2013/06/android-build-real-weather-app-json-http-and-openweathermap.html
        return dp;
    }

    private static String getString(String tagName, JSONObject jObj)
            throws JSONException {
        return jObj.getString(tagName);
    }
}

这篇关于从世界天气在线API数据显示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆