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

Community
  • 1
  • 1
ghostrider
  • 2,046
  • 3
  • 23
  • 46

5 Answers5

1

Add the INTERNET permission to your manifest file.

<uses-permission android:name="android.permission.INTERNET" /> 
user2203031
  • 402
  • 3
  • 14
1

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

user3641702
  • 393
  • 1
  • 5
  • 18
  • I tried it..But then the debug control goes till InputstreamReader and then finally block.It skips the between statements – ghostrider Aug 18 '15 at 14:59
  • But do you get an error? If not, then something might be wrong with the way you process/read the data – user3641702 Aug 18 '15 at 15:09
  • 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. – ghostrider Aug 18 '15 at 15:35
  • Have you tried removing the setRequestMethod("GET") line as well? – user3641702 Aug 18 '15 at 15:40
1

Try doing this:

urlConnection.setRequestMethod("GET");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.connect();
Aakash
  • 5,181
  • 5
  • 20
  • 37
  • I have tried your code in IDE, it is not giving any exception. By the way also add if you have not added it – Aakash Aug 18 '15 at 15:10
  • 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? – ghostrider Aug 18 '15 at 15:29
  • your code is completely fine, are you using emulator or a real device? – Aakash Aug 18 '15 at 15:36
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/87303/discussion-between-aakash-and-ghostrider). – Aakash Aug 18 '15 at 18:07
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!

BNK
  • 23,994
  • 8
  • 77
  • 87
  • The debug control didn't reach till the Inputstream declaration.Just after .connect() it goes to catch block.. – ghostrider Aug 18 '15 at 15:10
  • Check wifi, air-plane mode on your phone. Moreover, if logcat has more contents, post them – BNK Aug 18 '15 at 15:41
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!!

Community
  • 1
  • 1
ghostrider
  • 2,046
  • 3
  • 23
  • 46