Я пытаюсь отправить данные с android на php, используя метод POST
часть php проверяется сама по себе и работает на 100%, и она возвращает строку json как предполагаемую
часть андроида не работает, она не печатает ошибку или даже требуемый ответ
Вот код и он протестирован, печатая строку «test» с помощью Toast, но она не изменяется в коде волейбола 🙁
это код php:
<?php require_once(__DIR__.'/../dbConnect.php'); $userName=$_POST['username']; $query = "SELECT * FROM users WHERE username='$userName'"; $result = pg_query($con, $query); $rows = pg_num_rows($result); while ($row = pg_fetch_row($result)) { $field = pg_num_fields( $result ); for ( $i = 0; $i < $field; $i++ ) { $name = pg_field_name( $result, $i ); $user_arr[$name] = $row[$i]; } } echo json_encode($user_arr); pg_close($con); ?>
и это код Android:
инициализация тестовой строки для вывода вывода
String test = "none";
это то, где я называю метод
setUserData(username); Toast.makeText(LoginActivity.this, test, Toast.LENGTH_SHORT).show();
и это метод:
private void setUserData(final String username) { StringRequest strReq = new StringRequest(Request.Method.POST, Server.GET_USERDATA_URL, new Response.Listener<String>() { @Override public void onResponse(String response) { test= "test = "+response; } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(LoginActivity.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show(); } }) { @Override protected Map<String, String> getParams() { // Posting parameters to getData url Map<String, String> params = new HashMap<String, String>(); params.put(Server.KEY_USERNAME, username); return params; } }; //Creating a Request Queue RequestQueue requestQueue = Volley.newRequestQueue(this); //Adding request to the queue requestQueue.add(strReq); }
У вас проблема параллелизма. Когда вы выполняете setUserData(username)
Volley выполняет работу над фоновым потоком. Поэтому вам нужно подождать ответа, прежде чем вы сможете отобразить его в Toast. В тот момент, когда вы звоните:
Toast.makeText(LoginActivity.this, test, Toast.LENGTH_SHORT).show();
Сервер все еще не ответил, и test
прежнему не будет. Вам нужно вызвать тост из обратного вызова onResponse
:
private void setUserData(final String username) { StringRequest strReq = new StringRequest( Request.Method.POST, Server.GET_USERDATA_URL, new Response.Listener<String>() { @Override public void onResponse(String response) { test = "test = "+response; showToast(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(LoginActivity.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show(); } }) { @Override protected Map<String, String> getParams() { // Posting parameters to getData url Map<String, String> params = new HashMap<String, String>(); params.put(Server.KEY_USERNAME, username); return params; } }; //Creating a Request Queue RequestQueue requestQueue = Volley.newRequestQueue(this); //Adding request to the queue requestQueue.add(strReq); } private void showToast() { Toast.makeText(LoginActivity.this, test, Toast.LENGTH_SHORT).show(); }
Проверьте, получили ли вы разрешение на Интернет.
Также добавьте тост в
onResponse() Toast.makeText(LoginActivity.this, response.toString(), Toast.LENGTH_LONG).show();