java - Android Studio App Wont Run through database

190

The app runs, but a particular function wont. Whenever I try to login or Register an account, The Gradle console says it skipped frames and there's too much running. What I am trying to do is take in user information and send it to a database. This is the register activity code that has the problem. If i take the JSON out and just have the new activity open, it works.

 Response.Listener<String> responseListener = new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject jsonResponse = new JSONObject(response);
                        boolean success = jsonResponse.getBoolean("success");
                        if (success) {
                            Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                            RegisterActivity.this.startActivity(intent);
                        } else {
                            AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this);
                            builder.setMessage("Register Failed")
                                    .setNegativeButton("Retry", null)
                                    .create()
                                    .show();
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            };

            RegisterRequest registerRequest = new RegisterRequest(username, email, password, responseListener);
            RequestQueue queue = Volley.newRequestQueue(RegisterActivity.this);
            queue.add(registerRequest);
        }
    });
}
}

Php code for the Register:

 $username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];

$statement = mysqli_prepare($con, "INSERT INTO data (username, email, password) VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($statement, "sss", $username, $email, $password);
mysqli_stmt_execute($statement);

$response = array();
$response["success"] = true;  

echo json_encode($response);
?>

Register Request Code:

private Map<String, String> params;

public RegisterRequest(String username, String email, String password, Response.Listener<String> listener){
    /*
    NExt line means we are going to pass some information into the register.php
     */
    super(Method.POST, REGISTER_REQUEST_URL, listener, null);
    /*
    This is how we pass in the information from the register to the thing, we are using a hashmap
     */
    params = new HashMap<>();
    params.put("username", username);
    params.put("email", email);
    params.put("password", password);

}
/*
Volley needs to get the data so we do a get params
Which gives us this method
 */

@Override
public Map<String, String> getParams() {
    return params;
}
}

Does anyone know how I can solve this??? I don't know how to input Async task in this and if anyone can, please help. Is there anyway to fix this without an Async task? Thank You!

289

Answer

Solution:

You are probably running a network request on the main thread, that is the thread that is used by the Android Framework for rendering the UI. You need to have some kind of mechanism that does the networking tasks on another thread.AsyncTask is the simplest of them all to implement, and is good for your scenario, as it is a simple task.

ExtendAsyncTask and pass your request parameters to it in aMap:

public class RegisterTask extends AsyncTask<Map, Void, Boolean> {

    @Override
    protected Boolean doInBackground(Map... params) {
        Map props = params[0];  // you can access your request params here

        /*
         Do your network request here, using HttpUrlConnection or 
         HttpClient. and return a result (boolean in this example),
         which is passed to the onPostExecute method
        */
        return false;
    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {
        // This method is run on the main thread, so you can
        // update your UI after the request is completed.
    }
}

You can execute this task like this:

RegisterTask task = new RegisterTask();
task.execute(yourHashMapContainingData);

Check out this official Google documentation for more details: Perform Network Operations on a Separate Thread

People are also looking for solutions to the problem: PHP preg_replace escape ampersand in backreference regex

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.