2

While running an App to check the json string, I have the following Async Task.It gives an IO Exception when it reaches the "urlconnection.connect()". The Logcat just displays this Exception without any more explanation.Please help me where I am going wrong.

public class FetchWeatherTask extends AsyncTask<Void,Void,Void>
{

    private final String LOG_TAG = FetchWeatherTask.class.getSimpleName();

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;

        // Will contain the raw JSON response as a string.
        String forecastJsonStr = null;

        try {

            URL url = new URL("http://api.openweathermap.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7");

            // Create the request to OpenWeatherMap, and open the connection
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();

            // Read the input stream into a String
            InputStream inputStream = urlConnection.getInputStream();
            StringBuffer buffer = new StringBuffer();
            if (inputStream == null) {
                // Nothing to do.
                return null;
            }
            reader = new BufferedReader(new InputStreamReader(inputStream));

            String line;
            while ((line = reader.readLine()) != null) {
                buffer.append(line + "\n");
            }

            if (buffer.length() == 0) {
                // Stream was empty.  No point in parsing.
                return null;
            }
            forecastJsonStr = buffer.toString();

            Log.v(LOG_TAG,"Forecast JSON string"+forecastJsonStr);

        } catch (IOException e) {
            Log.e("PlaceholderFragment", "Error ", e);
            // If the code didn't successfully get the weather data, there's no point in attemping
            // to parse it.
            return null;
        } finally{
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (final IOException e) {
                    Log.e("PlaceholderFragment", "Error closing stream", e);
                }
            }
        }


        return null;
 }

LogCat is as follows:

08-18 20:12:14.608: E/PlaceholderFragment(15407): Error 
08-18 20:12:14.608: E/PlaceholderFragment(15407): java.io.IOException
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at       libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:87)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at  com.example.sunshineapp.ForecastFragment$FetchWeatherTask.doInBackground(Forecas    tFragment.java:121)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at  com.example.sunshineapp.ForecastFragment.onOptionsItemSelected(ForecastFragment.    java:55)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at  android.app.Fragment.performOptionsItemSelected(Fragment.java:1801)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at  android.app.FragmentManagerImpl.dispatchOptionsItemSelected(FragmentManager.java :1959)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.app.Activity.onMenuItemSelected(Activity.java:2569)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:350)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.support.v7.app.ActionBarActivity.onMenuItemSelected(ActionBarActivity.java:155)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.support.v7.app.ActionBarActivityDelegate$1.onMenuItemSelected(ActionBarActivityDelegate.java:74)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.support.v7.app.ActionBarActivityDelegateBase.onMenuItemSelected(ActionBarActivityDelegateBase.java:556)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:802)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:949)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.support.v7.internal.view.menu.ListMenuPresenter.onItemClick(ListMenuPresenter.java:169)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.widget.AdapterView.performItemClick(AdapterView.java:298)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.widget.AbsListView.performItemClick(AbsListView.java:1128)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.widget.AbsListView$PerformClick.run(AbsListView.java:2815)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.widget.AbsListView$1.run(AbsListView.java:3574)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.os.Handler.handleCallback(Handler.java:800)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.os.Handler.dispatchMessage(Handler.java:100)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.os.Looper.loop(Looper.java:194)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at android.app.ActivityThread.main(ActivityThread.java:5371)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at java.lang.reflect.Method.invokeNative(Native Method)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at java.lang.reflect.Method.invoke(Method.java:525)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
08-18 20:12:14.608: E/PlaceholderFragment(15407):   at   dalvik.system.NativeStart.main(Native Method)

Line 121 in the logcat is the "urlconnection.connect()".

EDIT:

While running the app I came across the error :

Network on main thread exception 
strictmode android block guard policy on network exception

These exceptions occur when there is a network intensive call on the UI thread.The answer can be found here.In order to avoid that I added the following code in the oncreate method of the main activity:

if (android.os.Build.VERSION.SDK_INT > 9) {
  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
  StrictMode.setThreadPolicy(policy);
}

Also in addition it is recommended to do the network intensive calls using Async Task.
This solved the issue. Thanks all for your help!!

0

5 Answers 5

1

Add the INTERNET permission to your manifest file.

<uses-permission android:name="android.permission.INTERNET" /> 
Sign up to request clarification or add additional context in comments.

1 Comment

Its added already: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="schemas.android.com/apk/res/android" package="com.example.sunshineapp" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.INTERNET" />
1

Remove the urlConnection.connect(); line, I think urlConnection = (HttpURLConnection) url.openConnection(); is already enough

4 Comments

I tried it..But then the debug control goes till InputstreamReader and then finally block.It skips the between statements
But do you get an error? If not, then something might be wrong with the way you process/read the data
I get the same exception when I remove the connect() method.I think the culprit is the urlconnection object because in each case of connect() and getinputstream() both are called on urlconnection.
Have you tried removing the setRequestMethod("GET") line as well?
1

Try doing this:

urlConnection.setRequestMethod("GET");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.connect();

4 Comments

I have tried your code in IDE, it is not giving any exception. By the way also add <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> if you have not added it
Added the same..but no change in exception. I tried using a different URL as well but the same exception.I think the "urlconnection" object is the culprit.If I remove the .connect() method it reaches till the inputstreamreader(where there is a function call on "urlconnection") and then goes into catch block. Do you find anything weird in the "urlconnection" object?
your code is completely fine, are you using emulator or a real device?
1

Try the following:

...
urlConnection.setDoInput(true);
...
urlConnection.connect();
InputStream inputStream = null;
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
     inputStream = urlConnection.getInputStream();
} else {
     inputStream = urlConnection.getErrorStream();
}
...

Moreover, use e.printStackTrace(); instead of Log.e("PlaceholderFragment", "Error ", e); for full logcat

UPDATE: Replace FetchWeatherTask f = new FetchWeatherTask(); f.doInBackground(null);

by

new FetchWeatherTask().execute();

Hope this helps!

2 Comments

The debug control didn't reach till the Inputstream declaration.Just after .connect() it goes to catch block..
Check wifi, air-plane mode on your phone. Moreover, if logcat has more contents, post them
0

While running the app I came across the error :

Network on main thread exception 
strictmode android block guard policy on network exception

These exceptions occur when there is a network intensive call on the UI thread.The answer can be found here.In order to avoid that I added the following code in the oncreate method of the main activity:

if (android.os.Build.VERSION.SDK_INT > 9) {
 StrictMode.ThreadPolicy policy = new     StrictMode.ThreadPolicy.Builder().permitAll().build();
 StrictMode.setThreadPolicy(policy);
 }

Also in addition it is recommended to do the network intensive calls using Async Task. This solved the issue. Thanks all for your help!!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.