Моя первая попытка входа в систему не дает мне никакого сообщения

#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 ? Вы можете обновить свой textview onPostExecute() . Тогда у вас не возникнет этой проблемы.

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();
}