Fran B.
Fran B.

Reputation: 5

Empty string when reading data sent from server

I'm having trouble with this code. The variable result should be filled from the response of the server, but for any reason, it keeps returning an empty string.

This is the entire code:

public class FragmentRally extends Fragment {

public FragmentRally() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_fragment_rally, container, false);


    new AsyncFetch().execute();


    return rootView;
}


// CONNECTION_TIMEOUT and READ_TIMEOUT are in milliseconds
public static final int CONNECTION_TIMEOUT = 10000;
public static final int READ_TIMEOUT = 15000;
private RecyclerView vistaRallye;
private AdapterRallye adaptadorRallye;

private class AsyncFetch extends AsyncTask<String, String, String> {
    ProgressDialog pdLoading = new ProgressDialog(getActivity());
    HttpURLConnection conn;
    URL url = null;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        //this method will be running on UI thread
        pdLoading.setMessage("\tCarregant...");
        pdLoading.setCancelable(false);
        pdLoading.show();

    }

    @Override
    protected String doInBackground(String... params) {
        try {

            // Enter URL address where your json file resides
            // Even you can make call to php file which returns json data
            url = new URL("http://www.rallyecat.esy.es/Obtenir_events.php");

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return e.toString();
        }
        try {

            // Setup HttpURLConnection class to send and receive data from php and mysql
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(READ_TIMEOUT);
            conn.setConnectTimeout(CONNECTION_TIMEOUT);
            conn.setRequestMethod("GET");

            // setDoOutput to true as we recieve data from json file
            conn.setDoOutput(true);

        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return e1.toString();
        }

        try {

            int response_code = conn.getResponseCode();

            // Check if successful connection made
            if (response_code == HttpURLConnection.HTTP_OK) {

                // Read data sent from server
                InputStream input = conn.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(input));
                StringBuilder result = new StringBuilder();
                String line;

                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }

                // Pass data to onPostExecute method
                return (result.toString());

            } else {

                return ("No hi ha connexió a internet.");
            }

        } catch (IOException e) {
            e.printStackTrace();
            return e.toString();
        } finally {
            conn.disconnect();
        }


    }

    @Override
    protected void onPostExecute(String result) {

        //this method will be running on UI thread

        pdLoading.dismiss();
        List<DataRallye> data = new ArrayList<>();

        pdLoading.dismiss();
        try {
            JSONArray jArray = new JSONArray(result);

            // Extract data from json and store into ArrayList as class objects
            for (int i = 0; i < jArray.length(); i++) {
                JSONObject json_data = jArray.getJSONObject(i);
                DataRallye dadesrallye = new DataRallye();
                dadesrallye.RallyeNom = json_data.getString("nom");
                dadesrallye.RallyeTipus = json_data.getString("tipus");
                dadesrallye.RallyeDataI = json_data.getString("datai");
                dadesrallye.RallyeDataF = json_data.getString("dataf");
                dadesrallye.RallyeCiutat = json_data.getString("ciutat");
                dadesrallye.RallyeOrganitzacio = json_data.getString("organitzacio");
                dadesrallye.RallyeFoto = json_data.getString("foto");
                data.add(dadesrallye);
            }

            // Setup and Handover data to recyclerview
            vistaRallye = (RecyclerView) getView().findViewById(R.id.llistarallyes);
            adaptadorRallye = new AdapterRallye(getActivity(), data);
            vistaRallye.setAdapter(adaptadorRallye);
            vistaRallye.setLayoutManager(new LinearLayoutManager(getActivity()));

        } catch (JSONException e) {
            Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show();
        }

    }

}

}

The problem appears here:

// Read data sent from server
                InputStream input = conn.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(input));
                StringBuilder result = new StringBuilder();
                String line;

                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }

                // Pass data to onPostExecute method
                return (result.toString());

This variable, RESULT is passed here, where I do the JSON Parse. But as it is empty, it goes directly to the catch exception:

@Override
    protected void onPostExecute(String result) {

        //this method will be running on UI thread

        pdLoading.dismiss();
        List<DataRallye> data = new ArrayList<>();

        pdLoading.dismiss();
        try {
            JSONArray jArray = new JSONArray(result);

            // Extract data from json and store into ArrayList as class objects
            for (int i = 0; i < jArray.length(); i++) {
                JSONObject json_data = jArray.getJSONObject(i);
                DataRallye dadesrallye = new DataRallye();
                dadesrallye.RallyeNom = json_data.getString("nom");
                dadesrallye.RallyeTipus = json_data.getString("tipus");
                dadesrallye.RallyeDataI = json_data.getString("datai");
                dadesrallye.RallyeDataF = json_data.getString("dataf");
                dadesrallye.RallyeCiutat = json_data.getString("ciutat");
                dadesrallye.RallyeOrganitzacio = json_data.getString("organitzacio");
                dadesrallye.RallyeFoto = json_data.getString("foto");
                data.add(dadesrallye);
            }

            // Setup and Handover data to recyclerview
            vistaRallye = (RecyclerView) getView().findViewById(R.id.llistarallyes);
            adaptadorRallye = new AdapterRallye(getActivity(), data);
            vistaRallye.setAdapter(adaptadorRallye);
            vistaRallye.setLayoutManager(new LinearLayoutManager(getActivity()));

        } catch (JSONException e) {
            Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show();
        }

Here is the JSON generated from a PHP file on our website:

[{"id_rally":"1","nom":"45e rallye costa brava","tipus":"velocitat i regularitat","datai":"2017-06-20","dataf":"2017-06-22","ciutat":"Girona","organitzacio":"rallyclassics ","foto":"brava.png"},{"id_rally":"2","nom":"26e rallye igualada","tipus":"velocitat","datai":"2017-08-13","dataf":"2017-08-16","ciutat":"Igualada","organitzacio":"ecb org","foto":"igualada.png"}]

Upvotes: 0

Views: 117

Answers (2)

Nidhin
Nidhin

Reputation: 1838

For 'GET' connections set

 conn.setDoOutput(false);

setDoOutput(true) is used for POST and PUT requests.

Upvotes: 0

greenapps
greenapps

Reputation: 11224

conn.setDoOutput(true);. 

Remove that line. As you will not write data to the outputstream.

result.append(line); 

That should be

result.append(line) + "\n"; 

Upvotes: 1

Related Questions