Gilbert Hair
Gilbert Hair

Reputation: 35

Retriving data using Android app using JSON and MySql

I'm trying to retrive data using WiFi but the application is crashing. When I use the localHost Emulator it is working just fine but when I use mobile data or WiFi it crashes. I can save data to MySql on localhost using WiFi but I just cant receive the data. Some of the time I get android.os.NetworkonMainThreadException. I'm a very new programmer just borrowed most of the code and need to clearly state how this can be resolved.

/**
 * Background Async Task to Get complete User details
 * */
class GetUserDetails extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Loading details. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Getting User details in background thread
     * */
    protected String doInBackground(String... params) {

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                // Check for success tag
                int success;
                try {
                    // Building Parameters
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("user_ID", "2"));

                    // getting User details by making HTTP request
                    // Note that User details url will use GET request
                    JSONObject json = jsonParser.makeHttpRequest(
                            LOGIN_URL, "GET", params);

                    // check your log for json response
                    Log.d("Single User Details", json.toString());

                    // json success tag
                    success = json.getInt(TAG_SUCCESS);
                    if (success == 1) {
                        // successfully received User details
                        JSONArray UserObj = json
                                .getJSONArray(TAG_User); // JSON Array

                        // get first User object from JSON Array
                        JSONObject User = UserObj.getJSONObject(0);

                        // User with this pid found
                        // Edit Text
                        txtlname = (EditText) findViewById(R.id.editText1);
                        txtfname = (EditText) findViewById(R.id.editText2);

                        // display User data in EditText
                        txtfname.setText(User.getString(TAG_FNAME));
                        txtlname.setText(User.getString(TAG_LNAME));

                    }else{
                        // User with pid not found
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        return null;
    }
    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once got all details
        pDialog.dismiss();
    }
}

Upvotes: 0

Views: 131

Answers (2)

Afshin
Afshin

Reputation: 977

Actually you shouldn't connect to internet in UI thread. You connected to internet through JSONObject json = jsonParser.makeHttpRequest( LOGIN_URL, "GET", params); in runOnUiThread( new Runnable.....

/**
 * Background Async Task to Get complete User details
 * */
class GetUserDetails extends AsyncTask<String, String, String> {

/**
 * Before starting background thread Show Progress Dialog
 * */
@Override
protected void onPreExecute() {
    super.onPreExecute();
    pDialog = new ProgressDialog(MainActivity.this);
    pDialog.setMessage("Loading details. Please wait...");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(true);
    pDialog.show();
}

/**
 * Getting User details in background thread
 * */
protected String doInBackground(String... params) {

    // updating UI from Background Thread

    // Check for success tag
    int success;
    try {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("user_ID", "2"));

        // getting User details by making HTTP request
        // Note that User details url will use GET request
        JSONObject json = jsonParser.makeHttpRequest(
                LOGIN_URL, "GET", params);

        // check your log for json response
        Log.d("Single User Details", json.toString());

        // json success tag
        success = json.getInt(TAG_SUCCESS);
        if (success == 1) {
            // successfully received User details
            JSONArray UserObj = json
                    .getJSONArray(TAG_User); // JSON Array

            // get first User object from JSON Array
            final JSONObject User = UserObj.getJSONObject(0);
            runOnUiThread(new Runnable() {
                public void run() {
                    // User with this pid found
                    // Edit Text
                    txtlname = (EditText) findViewById(R.id.editText1);
                    txtfname = (EditText) findViewById(R.id.editText2);

                    // display User data in EditText
                    txtfname.setText(User.getString(TAG_FNAME));
                    txtlname.setText(User.getString(TAG_LNAME));
                }
            });

        }else{
            // User with pid not found
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }


    return null;
}
/**
 * After completing background task Dismiss the progress dialog
 * **/
protected void onPostExecute(String file_url) {
    // dismiss the dialog once got all details
    pDialog.dismiss();
}
}

As you can see I just returned to UI thread when I want to work with views (like text views). Pay attention to user variable. I made it final to make it reachable inside the Runnable object I used as the parameter of runOnUiThread method.

Upvotes: 2

SuperFrog
SuperFrog

Reputation: 7674

You shouldn't execute UI related code in doInBackground, you should move UI related code to onPostExecute or onProgressUpdate methods of your AsyncTask.

This answer might help you:

Android : Calling the methods on UI thread from AsyncTask doInBackground method

Upvotes: 0

Related Questions