#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');
?>