Форма входа с использованием post работает только один раз? не могу найти ошибку

#java #android #android-activity #httprequest

#java #Android #android-активность #httprequest

Вопрос:

У меня была эта проблема, и я не могу понять, как с этим разобраться. Я использую android studio для компиляции своего проекта. Проблема, с которой я сталкиваюсь, заключается в том, что я могу успешно отправить регистрационную информацию только один раз, что для меня странно. Я не продвинутый программист Android.

Вот код, с которым у меня возникла проблема:

 public void postData(String valueIWantToSend) {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(LOGIN_URL);
    try {
        List nameValuePairs = new ArrayList();
        nameValuePairs.add(new BasicNameValuePair("username", user.getText().toString()));
        nameValuePairs.add(new BasicNameValuePair("password", pass.getText().toString()));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        response = httpclient.execute(httppost);
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private class MyAsyncTask extends AsyncTask<String, Integer, Double>{
    JSONArray jsonArray = null;
    HttpEntity entity = null;
    String responsestr = null;
    JSONObject json = null;
    @Override
    protected Double doInBackground(String... params) {
        postData(params[0]);
        return null;
    }
    protected void onPostExecute(Double result){
        pb.setVisibility(View.GONE);
        entity = response.getEntity();
        try {
            responsestr = EntityUtils.toString(entity);
            Toast.makeText(getApplicationContext(), 
                "We have good response string", 
                Toast.LENGTH_SHORT)
                .show();
            jsonArray = new JSONArray(responsestr);
        } catch (JSONException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Integer success = 0;
        for (int i=0; i<jsonArray.length(); i  )
        {
            json = null;
            try {
                json = jsonArray.getJSONObject(i);
                success = json.getInt("success");
                Toast.makeText(getApplicationContext(), 
                    "We Have a good return", 
                    Toast.LENGTH_SHORT)
                    .show();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        if (success == 1){
            Toast.makeText(getApplicationContext(), "Login Successful", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getApplicationContext(), "Login Failed", Toast.LENGTH_SHORT).show();
        }
    }
    protected void onProgressUpdate(Integer... progress){
        pb.setProgress(progress[0]);
    }
}
  

Теперь, как я уже сказал, это работает один раз, а затем перестает реагировать, если вы повторите попытку входа в систему или исправите пароль имени пользователя?

Действительно не уверен, как это исправить. Если я пропустил какую-либо информацию, дайте мне знать, и я буду рад предоставить ее вам.

Редактировать 1 (может быть долгая ночь):

Хорошо, я видел, что post работает каждый раз, прежде чем приложение перестанет реагировать. кажется, что он извлекает данные только один раз, а затем никогда больше, даже если приложение закрыто и снова открыто. он будет работать снова, только если я перекомпилирую из Android studio, после чего он вернется к своему не реагирующему состоянию: (.

Редактировать 2:

Извините, ребята, вот как я вызываю асинхронную задачу из события onClick, прикрепленного к кнопке входа

 public void sendMessage(View view){

    String s1, s2;

    s1 = user.getText().toString();
    s2 = pass.getText().toString();


    if ((s1.matches("")) || (s2.matches(""))) {
        Toast.makeText(this, "Please fill out all fields.", Toast.LENGTH_SHORT).show();
    } else {
        //Intent intent = new Intent(this, com.example.studentpa.Dashboard.class);
        //startActivity(intent);
        pb.setVisibility(View.VISIBLE);
        new MyAsyncTask().execute(s1);
    }
}
  

Комментарии:

1. В какой части кода он перестает отвечать на запросы? Мне кажется, что это может быть проблемой где-то еще. Как вы вызываете AsyncTask из своего кода?

2. @Darwind Привет, приятель. добавлено событие onClick, в котором я вызываю асинхронную задачу, посмотрите. Как вы думаете, где может быть ошибка и какую другую информацию я должен предоставить?

3. Не похоже, что в вашем коде есть какой-либо код, который может сделать ваше приложение невосприимчивым. Попробуйте выполнить код с активным отладчиком. Посмотрите, где она останавливается… вы уверены, что ваш серверный код не создает какое-либо нежелательное состояние? Возможно, возвращая какой-то фиктивный JSON?

4. @Darwind Привет, приятель. Разобрался с проблемой, во-первых, как вы сказали, сервер не возвращал правильно закодированный JSON, во-вторых, данные post потребляли слишком много вычислительной мощности в основном потоке, поэтому я включил их в AsyncTask, и, в-третьих, у меня были необработанные исключения, я опубликовал ответ о том, как я разобрался. Спасибо за помощь, приятель.

5. Приятно знать и здорово, что вы опубликовали ответ, хотя другим людям может быть немного сложно использовать, поскольку это была проблема с сервером 🙂

Ответ №1:

я нашел решение своей проблемы, пожалуйста, ознакомьтесь с комментариями к внесенным изменениям, также вот код, который теперь работает.

 public void loginMethod(View view) {
    em = email.getText().toString();
    ps = pass.getText().toString();

    if (isConnected()) {
        if (em.contains(" ") || ps.contains(" ")) {
            Toast.makeText(getApplicationContext(), "No spaces are allowed in either field", Toast.LENGTH_SHORT).show();
        } else if (em.matches("") || ps.matches("")) {
            Toast.makeText(getApplicationContext(), "Please fill in all fields", Toast.LENGTH_SHORT).show();
        } else {
            pb.setVisibility(View.VISIBLE);
            new MyAsyncTask().execute(em);

            email.setEnabled(false);
            pass.setEnabled(false);
        }
    } else {
        Toast.makeText(getApplicationContext(), "You are not connected to the internet", Toast.LENGTH_SHORT).show();
    }

}

private class MyAsyncTask extends AsyncTask<String, Integer, Double> {

    @Override
    protected Double doInBackground(String... params) {
        postData(params[0]);
        return null;
    }

    protected void onPostExecute(Double result) {
        if (strResponse.isEmpty()){
            Toast.makeText(getApplicationContext(), "We have no response from the server", Toast.LENGTH_LONG).show();
        } else {
            try {
                jsonArray = new JSONArray(strResponse);
            } catch (JSONException e){
                e.printStackTrace();
            }

            JSONObject json;
            json = null;
            Integer success = 0;

            for (int i=0; i<jsonArray.length(); i  )
            {
                json = null;
                try {
                    json = jsonArray.getJSONObject(i);

                    success = json.getInt("success");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            if (success == 1){
                Toast.makeText(getApplicationContext(), "Login Successful", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(getApplicationContext(), Dashboard.class);
                startActivity(intent);
            } else if (success == 0){
                Toast.makeText(getApplicationContext(), "Incorrect Login Details", Toast.LENGTH_SHORT).show();
            }

        }

        email.setEnabled(true);
        pass.setEnabled(true);

        pb.setVisibility(View.GONE);
    }

    protected void onProgressUpdate(Integer... progress) {
        pb.setProgress(progress[0]);
    }

    public void postData(String s1) {
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://www.gbes.co.za");
        HttpEntity entity;

        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("username", em));
            nameValuePairs.add(new BasicNameValuePair("password", ps));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);
            entity = response.getEntity();
            strResponse = EntityUtils.toString(entity);
        } catch (HttpResponseException e) {
            e.printStackTrace();
        } catch (HttpHostConnectException e){
            e.printStackTrace();
        } catch (ClientProtocolException e){
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
  

Редактировать:

Привет, ребята, вот код сервера: подключение к базе данных скрыто для защиты сервера

 <?php
$uName=$_POST['username'];
$pWord=$_POST['password'];

$squl = "SELECT * FROM `usr` WHERE `uE`='".$uName."' amp;amp; `uP`='".$pWord."' LIMIT 1";
$query = mysql_query($squl);
if (mysql_num_rows($query) == 1)
{
    date_default_timezone_set('Africa/Johannesburg');

    while($rows = mysql_fetch_array($query)){
        $logincount=$rows['uLC'];
        $logincount=$logincount   1;
        $uid=$rows['ID'];
    }
    $nowtime = date("Y-m-d H:i:s");
    $loginsql = "UPDATE `users` SET `uLC`=$logincount, `uLL`='$nowtime'";
    $query = mysql_query($loginsql);


    $login_ok = true;
} else {
    $login_ok = false;
}

if ($login_ok) {
    $response["success"] = 1;
    $response["message"] = "Login successful!"; 
    die("[".json_encode($response)."]");
} else {
    $response["success"] = 0;
    $response["message"] = "Invalid Credentials!";
    die("[".json_encode($response)."]");
}   
mysql_close($db);

header('Content-Type: text/html; charset=utf-8'); 
?>