1

I have a problem with Android App. I tried to create a basic app to connect with same server with help of a tutorial. But after I had run the code I received the error: android.os.NetworkOnMainThreadException.

Here is my code:

package com.czerwinski.top10downloader;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class MainActivity extends AppCompatActivity {


    private static final String TAG = "MainActivity";

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

        Log.d(TAG, "onCreate: starting async task");
        DownloadData downloadData = new DownloadData();

        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED) {
            Log.d(TAG, "onCreate: Internet Permission Given");
            downloadData.doInBackground("http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topfreeapplications/limit=10/xml");
        }
        Log.d(TAG, "onCreate: done...");
    }

    private class DownloadData extends AsyncTask<String, Void, String> {

        private static final String TAG = "DownloadData";

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Log.d(TAG, "onPostExecute: parameter is: " + s);
        }

        @Override
        protected String doInBackground(String... strings) {
            Log.d(TAG, "doInBackground: starts with: " + strings[0]);
            String rssFeed = downloadXML(strings[0]);

            if(rssFeed == null) {
                Log.i(TAG, "doInBackground: Error downloading");
            }
            return rssFeed;
        }

        private String downloadXML(String urlPath) {
            Log.d(TAG, "downloadXML: Starting downloadXML");
            StringBuilder xmlResult = new StringBuilder();

            try {
                URL url = new URL(urlPath);
                Log.d(TAG, "downloadXML: Created URL");
                URLConnection connection = (URLConnection)url.openConnection();
                connection.setConnectTimeout(10 * 1000);
                connection.setReadTimeout(10 * 1000);
                HttpURLConnection httpConnection = (HttpURLConnection) connection;
                Log.d(TAG, "downloadXML: Opened connection");

                int response = httpConnection.getResponseCode();

                Log.d(TAG, "downloadXML: The response code was " + response);

//                InputStream inputStream = connection.getInputStream();
//                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
//                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

                int charsRead;
                char[] inputBuffer = new char[500];

                while(true) {
                    charsRead = bufferedReader.read(inputBuffer);
                    if(charsRead < 0) {
                        break;
                    }
                    if(charsRead > 0) {
                        xmlResult.append(String.copyValueOf(inputBuffer, 0, charsRead));
                    }
                }

                bufferedReader.close();

                Log.d(TAG, "downloadXML: The response was: " + xmlResult.toString());

                return xmlResult.toString();
            } catch (MalformedURLException e) {
                Log.e(TAG, "downloadXML: Invalid URL" + e.getMessage());
            } catch (IOException e) {
                Log.e(TAG, "downloadXML: IO Exception reading data " + e.getMessage());
            } catch (Exception e) {
                Log.e(TAG, "downloadXML: General exception: " + e);
            }

            return null;
        }
    }
}

And here are some errors outputs that I received:

2018-10-05 18:41:46.225 31414-31414/com.czerwinski.top10downloader D/DownloadData: doInBackground: starts with: http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topfreeapplications/limit=10/xml

2018-10-05 18:41:46.225 31414-31414/com.czerwinski.top10downloader D/DownloadData: downloadXML: Starting downloadXML

2018-10-05 18:41:46.225 31414-31414/com.czerwinski.top10downloader D/DownloadData: downloadXML: Created URL

2018-10-05 18:41:46.229 31414-31414/com.czerwinski.top10downloader D/DownloadData: downloadXML: Opened connection

2018-10-05 18:41:46.231 31414-31414/com.czerwinski.top10downloader E/DownloadData: downloadXML: General exception: android.os.NetworkOnMainThreadException

2018-10-05 18:41:46.231 31414-31414/com.czerwinski.top10downloader I/DownloadData: doInBackground: Error downloading

Does any one know what is wrong with my code?

Thanks for any help that you will provide :)

Update 1

I believe that i had already done the stepsthat is mentioned in this question: How do I fix android.os.NetworkOnMainThreadException?

Method that is responsible for connection to the network is in class that extends AsyncTask, called in doInBackground method. Still, the error appears every time that i lunch debug. I'm still looking for the answer for my question.

0 Answers0