0

I am trying to parse Json data from a weather api in Android. But i am getting errors. Here is the list of logcat errors:

10-17 21:22:36.395: E/log_tag(304): Error in http connection java.net.UnknownHostException: api.openweathermap.org
10-17 21:22:36.395: E/log_tag(304): Error converting result java.lang.NullPointerException
10-17 21:22:36.425: E/log_tag(304): Error parsing data org.json.JSONException: End of input at character 0 of 
10-17 21:22:36.447: E/AndroidRuntime(304): FATAL EXCEPTION: AsyncTask #1
10-17 21:22:36.447: E/AndroidRuntime(304): java.lang.RuntimeException: An error occured while executing doInBackground()
10-17 21:22:36.447: E/AndroidRuntime(304):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
10-17 21:22:36.447: E/AndroidRuntime(304):  at java.lang.Thread.run(Thread.java:1096)
10-17 21:22:36.447: E/AndroidRuntime(304): Caused by: java.lang.NullPointerException
10-17 21:22:36.447: E/AndroidRuntime(304):  at com.example.work.MainActivity$DownloadJSON.doInBackground(MainActivity.java:63)
10-17 21:22:36.447: E/AndroidRuntime(304):  at com.example.work.MainActivity$DownloadJSON.doInBackground(MainActivity.java:1)
10-17 21:22:36.447: E/AndroidRuntime(304):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
10-17 21:22:36.447: E/AndroidRuntime(304):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-17 21:22:36.447: E/AndroidRuntime(304):  ... 4 more

Here is my code: MainActivity.java:

package com.example.work;

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;

public class MainActivity extends Activity {
    // Declare Variables
    JSONObject jsonobject;
    JSONArray jsonarray;
    ListView listview;
    ListViewAdapter adapter;
    ProgressDialog mProgressDialog;
    ArrayList<HashMap<String, String>> arraylist;
    static String NAME = "rank";
    static String TYPE = "country";
    static String FLAG = "flag";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Get the view from listview_main.xml
        setContentView(R.layout.activity_main);
        // Execute DownloadJSON AsyncTask
        new DownloadJSON().execute();
    }

    // DownloadJSON AsyncTask
    private class DownloadJSON extends AsyncTask<Void, Void, Void> {

        //@Override
        //protected void onPreExecute() {
          //  super.onPreExecute();
            // Create a progressdialog
            //mProgressDialog = new ProgressDialog(MainActivity.this);

            // Set progressdialog message
            //mProgressDialog.setMessage("Loading...");
            //mProgressDialog.setIndeterminate(false);
            // Show progressdialog
            //mProgressDialog.show();
       // }
        @Override
        protected Void doInBackground(Void... params) {
            // Create an array
            arraylist = new ArrayList<HashMap<String, String>>();
            // Retrieve JSON Objects from the given URL address
            jsonobject = JSONParser
                    .getJSONfromURL("http://api.openweathermap.org/data/2.5/weather?id=2172797");

            try {
                // Locate the array name in JSON
                jsonarray = jsonobject.getJSONArray("id");

                for (int i = 0; i < jsonarray.length(); i++) {
                    HashMap<String, String> map = new HashMap<String, String>();
                    jsonobject = jsonarray.getJSONObject(i);
                    // Retrive JSON Objects
                   map.put(MainActivity.NAME, jsonobject.getString("main"));
map.put(MainActivity.TYPE, jsonobject.getString("description"));
//map.put(MainActivity.FLAG, jsonobject.getString("restaurantIMAGE"));
                    // Set the JSON Objects into the array
                    arraylist.add(map);
                }
            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void args) {
            // Locate the listview in listview_main.xml
            listview = (ListView) findViewById(R.id.listview);
            // Pass the results into ListViewAdapter.java
            adapter = new ListViewAdapter(MainActivity.this, arraylist);
            // Set the adapter to the ListView
            listview.setAdapter(adapter);
            // Close the progressdialog
            mProgressDialog.dismiss();
        }
    }
}

JSONParser.java:

public class JSONParser {
public static JSONObject getJSONfromURL(String url) {
    InputStream is = null;
    String result = "";
    JSONObject jArray = null;

    // Download JSON data from URL
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(url);
        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();

    } catch (Exception e) {
        Log.e("log_tag", "Error in http connection " + e.toString());
    }

    // Convert response to string
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();
    } catch (Exception e) {
        Log.e("log_tag", "Error converting result " + e.toString());
    }

    try {

        jArray = new JSONObject(result);
    } catch (JSONException e) {
        Log.e("log_tag", "Error parsing data " + e.toString());
    }

    return jArray;
}
}

ListViewAdapter.java:

public class ListViewAdapter extends BaseAdapter {

    // Declare Variables
    Context context;
    LayoutInflater inflater;
    ArrayList<HashMap<String, String>> data;
    //ImageLoader imageLoader;
    HashMap<String, String> resultp = new HashMap<String, String>();

    public ListViewAdapter(Context context,
            ArrayList<HashMap<String, String>> arraylist) {
        this.context = context;
        data = arraylist;
      //  imageLoader = new ImageLoader(context);
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {
        // Declare Variables
        TextView main;
        TextView description;
        //ImageView flag;

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View itemView = inflater.inflate(R.layout.listview_item, parent, false);
        // Get the position
        resultp = data.get(position);

        // Locate the TextViews in listview_item.xml
        main = (TextView) itemView.findViewById(R.id.main);
        description = (TextView) itemView.findViewById(R.id.description);

        // Locate the ImageView in listview_item.xml
        //flag = (ImageView) itemView.findViewById(R.id.flag);

        // Capture position and set results to the TextViews
        main.setText(resultp.get(MainActivity.NAME));
        description.setText(resultp.get(MainActivity.TYPE));
        // Capture position and set results to the ImageView
        // Passes flag images URL into ImageLoader.class
      //  imageLoader.DisplayImage(resultp.get(MainActivity.FLAG), flag);
        // Capture ListView item click
        itemView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // Get the position
                resultp = data.get(position);
                Intent intent = new Intent(context, SingleItemView.class);
                // Pass all data rank
                intent.putExtra("name", resultp.get(MainActivity.NAME));
                // Pass all data country
                intent.putExtra("type", resultp.get(MainActivity.TYPE));
                // Pass all data flag
               // intent.putExtra("flag", resultp.get(MainActivity.FLAG));
                // Start SingleItemView Class
                context.startActivity(intent);

            }
        });
        return itemView;
    }
}

SingleItemView.java:

public class SingleItemView {
    Intent intent = getIntent();
    String id = intent.getStringExtra("name");
    String name = intent.getStringExtra("type");
    private Intent getIntent() {
        // TODO Auto-generated method stub
        return null;
    }

}

listview_item.xml in layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:id="@+id/main"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:id="@+id/description"/>
</LinearLayout>

I am searching weather data by city id.But getting these errors.

NOOB
  • 2,717
  • 4
  • 22
  • 22
  • 2
    Your logcat shows a `NullPointerException` on line 63 of MainActivity.java. What line is that? Put a breakpoint there and find out which variable is null. Then examine why it might be null, and fix it. – Bryan Herbst Oct 17 '13 at 16:06
  • @Tanis.7x The key for JSON array was wrong. I used id instead of weather from the api. Even then it is giving null pointer exception at same line – NOOB Oct 17 '13 at 16:32

3 Answers3

3

Use JSONLint to see your Json structure

And i used your URL"http://api.openweathermap.org/data/2.5/weather?id=2172797"

and getting the Json As below

{
    "coord": {
        "lon": 145.766663,
        "lat": -16.91667
    },
    "sys": {
        "country": "AU",
        "sunrise": 1381952820,
        "sunset": 1381997847
    },
    "weather": [
        {
            "id": 803,
            "main": "Clouds",
            "description": "broken clouds",
            "icon": "04n"
        }
    ],
    "base": "global stations",
    "main": {
        "temp": 297.15,
        "pressure": 1015,
        "humidity": 88,
        "temp_min": 297.15,
        "temp_max": 297.15
    },
    "wind": {
        "speed": 2.1,
        "deg": 350
    },
    "rain": {
        "3h": 0
    },
    "clouds": {
        "all": 75
    },
    "dt": 1382022000,
    "id": 2172797,
    "name": "Cairns",
    "cod": 200
}

In this line

jsonarray = jsonobject.getJSONArray("id");//Wrong Key for JsonArray

You made mistake

It should be

jsonarray = jsonobject.getJSONArray("weather");// weather is key for Array

Edited:

@Override
        protected Void doInBackground(Void... arg0) {
            String url="http://api.openweathermap.org/data/2.5/weather?id=2172797";
            JSONObject json=parser.getJSONFromUrl(url);
            try {
                JSONObject child=json.getJSONObject("coord");
                System.out.println("Child"+child.getString("lon"));
                JSONArray jsonArray=json.getJSONArray("weather");
                for(int i=0;i<jsonArray.length();i++)
                {
                    JSONObject wether=jsonArray.getJSONObject(i);
                    System.out.println("Wether"+wether.getString("id")+" "+wether.getString("main"));
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

OutPut:-

10-17 16:41:58.582: I/System.out(1312): Child 145.76666 
10-17 16:41:58.582: I/System.out(1312): Wether 803 Clouds

Now follow the same for getting all the values you needed.

Hope this will help you.

Amit Gupta
  • 8,914
  • 1
  • 25
  • 33
0

You are getting UnknownHostException , that means you have connectivity problem. Check your internet connection and also check if you have added permission for INTERNET in your app's manifest.

In your JSONParser class you are returning a JSONObject from getJSONFromURL method. For some reason , most probably due to connectivity problem or server issue response is invalid. You have tried that response to read as JSONObject and it failed to parse. So, your method returning a null to doInBackground in AsyncTask. So, a null pointer exception is happening.

So, you should check why are you getting unknownHostException and fix the null issue in getJSONFromURL method. And also you have to parse your JSON correctly because there's error in your parsing as well which Amit Gupta mentioned. Hope it helps.

ayon
  • 2,180
  • 2
  • 17
  • 32
0

Your logcat says:

Error in http connection java.net.UnknownHostException: api.openweathermap.org

You need to add network permission in your manifest xml file

It is there already

Then check your device:

  • you might be in airplane mode.
  • Data Connection is off
  • If your on wi-fi, check your firewall settings, something is blocking you

I am running it on an emulator not on a device

From an SO answer:

The answer is devilishly simple: remove, then re-create your AVD (virtual device/emulator) in Eclipse. It worked for me--first time.

Community
  • 1
  • 1
meda
  • 45,103
  • 14
  • 92
  • 122