0

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();
    }
}

2 Answers 2

2

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.

Sign up to request clarification or add additional context in comments.

Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.