duanchandun1860
2016-06-17 23:36
浏览 78

Android Studio App不会运行数据库

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!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dqxafj6830 2016-06-18 05:35
    已采纳

    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.

    Extend AsyncTask and pass your request parameters to it in a Map:

    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

    点赞 评论

相关推荐 更多相似问题