ghostrider
ghostrider

Reputation: 2238

IO Exception while connecting to the url at the connect()

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!!

Upvotes: 2

Views: 3003

Answers (5)

ghostrider
ghostrider

Reputation: 2238

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!!

Upvotes: 0

BNK
BNK

Reputation: 24114

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!

Upvotes: 1

Aakash
Aakash

Reputation: 5251

Try doing this:

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

Upvotes: 1

user3641702
user3641702

Reputation: 393

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

Upvotes: 1

user2203031
user2203031

Reputation: 402

Add the INTERNET permission to your manifest file.

<uses-permission android:name="android.permission.INTERNET" /> 

Upvotes: 1

Related Questions