#java #android #forms #login #http-post
#java #Android #формы #аутентификация #http-post
Вопрос:
При первой попытке входа в систему, независимо от того, верна ли информация для входа или нет, я не получаю ответа, когда предполагается, что он говорит либо «Неверный идентификатор пользователя / пароль», либо «Вход в систему выполнен успешно!». Но в любое время после первой попытки он выводит правильное сообщение, почему он это делает?
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
un = (EditText) findViewById(R.id.et_un);
pw = (EditText) findViewById(R.id.et_pw);
ok = (Button) findViewById(R.id.btn_login);
// error = (TextView) findViewById(R.id.tv_error);
textview = (TextView) findViewById(R.id.textView1);
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
* According with the new StrictGuard policy, running long tasks
* on the Main UI thread is not possible So creating new thread
* to create and execute http operations
*/
new Thread(new Runnable() {
@Override
public void run() {
ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("UserID",
un.getText().toString()));
postParameters.add(new BasicNameValuePair("Password",
pw.getText().toString()));
String response = null;
try {
response = SimpleHttpClient
.executeHttpPost("website",
postParameters);
res = response.toString();
resp = res.replaceAll("\s ", "");
System.out.println(res);
} catch (Exception e) {
e.printStackTrace();
errorMsg = e.getMessage();
}
}
}).start();
try {
Thread.sleep(1000);
/**
* Inside the new thread we cannot update the main thread So
* updating the main thread outside the new thread
*/
//error.setText(resp);
if(res.indexOf("<TITLE>LoginOk</TITLE>") != -1 ||(resp.indexOf("<TITLE>Login</TITLE>") != -1)) {
textview.setText("Incorrect User ID / Password");
}
else if(res.indexOf("Already") != -1){
textview.setText("An account is already logged In");
}
else{
textview.setText("Login Successful! ");
}
if (null != errorMsg amp;amp; !errorMsg.isEmpty()) {
textview.setText(errorMsg);
}
} catch (Exception e) {
textview.setText(e.getMessage());
}
}
});
}
Комментарии:
1. Возможно, он получает ответ от сервера с небольшим опозданием. Почему вы не используете
AsyncTask
? Вы можете обновить свой textviewonPostExecute()
. Тогда у вас не возникнет этой проблемы.2. Можете ли вы немного помочь мне в том, как я мог бы реализовать AsyncTask в этом
3. Проверьте мой ответ ниже.
Ответ №1:
В вашем коде условия, которые вы ставите для отображения сообщения, выполняются перед запуском вашего потока, поэтому ваш ответ всегда нулевой или пустой, который не удовлетворяет ни одному из ваших условий и из-за этого не выполняется правильно.
Что вам нужно сделать, это просто реализовать обработчик, который вам нужно вызвать в потоке, после вашей основной реализации кода.
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
/**
* Inside the new thread we cannot update the main thread So
* updating the main thread outside the new thread
*/
//error.setText(resp);
if(res.indexOf("<TITLE>LoginOk</TITLE>") != -1 ||(resp.indexOf("<TITLE>Login</TITLE>") != -1)) {
textview.setText("Incorrect User ID / Password");
}
else if(res.indexOf("Already") != -1){
textview.setText("An account is already logged In");
}
else{
textview.setText("Login Successful! ");
}
if (null != errorMsg amp;amp; !errorMsg.isEmpty()) {
textview.setText(errorMsg);
}
}
};
Thread thread = new Thread(){
@Override
public void run() {
super.run();
ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("UserID",
un.getText().toString()));
postParameters.add(new BasicNameValuePair("Password",
pw.getText().toString()));
String response = null;
try {
response = SimpleHttpClient
.executeHttpPost("http://www.e-learning.com/wlc_loginok.asp",
postParameters);
res = response.toString();
resp = res.replaceAll("\s ", "");
System.out.println(res);
} catch (Exception e) {
e.printStackTrace();
errorMsg = e.getMessage();
}finally{
handler.sendEmptyMessage(0);
}
}
};
thread.start();
Ответ №2:
Попробуйте это и дайте мне знать…
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
un = (EditText) findViewById(R.id.et_un);
pw = (EditText) findViewById(R.id.et_pw);
ok = (Button) findViewById(R.id.btn_login);
textview = (TextView) findViewById(R.id.textView1);
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = un.getText().toString()));
String password = pw.getText().toString()));
new MyTask().execute(username, password); // here I'm sending these two values to AsyncTask class
}
});
}
// here is the AsyncTask
public class MyTask extends AsyncTask<String,Void,String> {
@Override
protected String doInBackground(String... params) {
ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("UserID",
params[0])); // params[0] contains the first value that you have passed and params[1] second value.
postParameters.add(new BasicNameValuePair("Password",
params[1]));
String response = null;
try {
response = SimpleHttpClient
.executeHttpPost("http://www.e-learning.com/wlc_loginok.asp",
postParameters);
res = response.toString();
resp = res.replaceAll("\s ", "");
System.out.println(res);
return res;
} catch (Exception e) {
e.printStackTrace();
errorMsg = e.getMessage();
}
} // end of doInBackground
@Override
protected Void onPostExecute(String res){
super.onPostExecute(res);
if(res.indexOf("<TITLE>LoginOk</TITLE>") != -1 ||(resp.indexOf("<TITLE>Login</TITLE>") != -1)) {
textview.setText("Incorrect User ID / Password");
}
else if(res.indexOf("Already") != -1){
textview.setText("An account is already logged In");
}
else{
textview.setText("Login Successful! ");
}
if (null != errorMsg amp;amp; !errorMsg.isEmpty()) {
textview.setText(errorMsg);
}
} // end of onPostExecute
} // end of AsyncTask class
Комментарии:
1. Отлично! единственная ошибка заключалась в том, что я думаю, что она должна быть защищенной строкой doInBackground вместо void, потому что в противном случае она выдала мне ошибку. в любом случае спасибо!
2. Пожалуйста, проголосуйте за это тоже, чтобы это было полезно для других, сталкивающихся с такой же проблемой.
Ответ №3:
Попробуйте получить ответ, подобный этому, и обработайте дальше.
HttpResponse response = httpClient.execute(httppost);
HttpEntity rp = response.getEntity();
//String builder from response
if (rp.getContentLength() != 0) {
StringBuilder sb = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(rp.getContent()));
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
origresponseText = sb.toString();
}