2015-01-28 2 views
0

Я пытаюсь создать функцию входа, чтобы я мог проверить пользователей. Я передаю имя пользователя, переменные пароля в класс AsyncTask, но я не знаю, как получить результаты, чтобы использовать их. Любая помощь? (Я отправляю часть исходного кода из-за ограничений веб-сайта)Android Войти с сообщением HTTP, получить результаты

btnLogin.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if(txtUsername.getText().toString().trim().length() > 0 && txtPassword.getText().toString().trim().length() > 0) 
      { 
       // Retrieve the text entered from the EditText 
       String Username = txtUsername.getText().toString(); 
       String Password = txtPassword.getText().toString(); 
       /*Toast.makeText(MainActivity.this, 
         Username +" + " + Password+" \n Ready for step to post data", Toast.LENGTH_LONG).show();*/ 

       String[] params = {Username, Password}; 
       // we are going to use asynctask to prevent network on main thread exception 
       new PostDataAsyncTask().execute(params); 

       // Redirect to dashboard/home screen. 
       login.dismiss(); 
      } 
      else 
      { 
       Toast.makeText(MainActivity.this, 
       "Please enter Username and Password", Toast.LENGTH_LONG).show(); 

      } 
     } 
    }); 

Затем я использую AsynkTask сделать чек, но не знаете, как получить результаты и хранить их в переменной. Любая помощь?

public class PostDataAsyncTask extends AsyncTask<String, String, String> { 

    protected void onPreExecute() { 
     super.onPreExecute(); 
     // do stuff before posting data 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     try { 
      // url where the data will be posted 
      String postReceiverUrl = "http://server.com/Json/login.php"; 
      Log.v(TAG, "postURL: " + postReceiverUrl); 
      String line = null; 
      String fail = "notok"; 

      // HttpClient 
      HttpClient httpClient = new DefaultHttpClient(); 

      // post header 
      HttpPost httpPost = new HttpPost(postReceiverUrl); 

      // add your data 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
      nameValuePairs.add(new BasicNameValuePair("UserName", params[0])); 
      nameValuePairs.add(new BasicNameValuePair("Password", params[1])); 

      httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      // execute HTTP post request 
      HttpResponse response = httpClient.execute(httpPost); 
      HttpEntity resEntity = response.getEntity(); 
      line = resEntity.toString(); 
      Log.v(TAG, "Testing response: " + line); 

      if (resEntity != null) { 

       String responseStr = EntityUtils.toString(resEntity).trim(); 
       Log.v(TAG, "Response: " + responseStr); 
       Intent Hotels_btn_pressed = new Intent(MainActivity.this, Hotels.class); 
       startActivity(Hotels_btn_pressed); 
       // you can add an if statement here and do other actions based on the response 
       Toast.makeText(MainActivity.this, 
         "Error! User does not exist", Toast.LENGTH_LONG).show(); 
      }else{ 
       finish(); 
      } 

     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String lenghtOfFile) { 
     // do stuff after posting data 
    } 
} 
+0

Возможный дубликат [Пример Android для AsyncTask] (http://stackoverflow.com/questions/9671546/asynctask-android-example) –

+0

, где вы хотите использовать ответ? если 'PostDataAsyncTask' является отдельным классом, то используйте пользовательский Listener, который будет срабатывать в Activity, когда onPostExecute вызывается –

+0

. Я хотел бы получить ответ, хранящийся в переменной, чтобы передать его следующим действиям. –

ответ

0

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

Я хотел бы создать интерфейс (назовем его «LogInListener»):

public interface LoginListener { 
    void onSuccessfulLogin(String response); 
    void onFailedLogin(String response); 
} 

Класс «MainActivity» будет реализовывать этот интерфейс и установить себя в качестве слушателя «PostDataAsyncTask». Таким образом, создание асинхронной задачи от основной деятельности будет выглядеть следующим образом:

String[] params = {Username, Password}; 
// we are going to use asynctask to prevent network on main thread exception 
PostDataAsyncTask postTask = new PostDataAsyncTask(this); 
postTask.execute(params); 

Я бы переместить класс «PostDataAsyncTask» в новый файл:

public class PostDataAsyncTask extends AsyncTask<String, String, String> { 
    private static final String ERROR_RESPONSE = "notok"; 

    private LoginListener listener = null; 

    public PostDataAsyncTask(LoginListener listener) { 
     this.listener = listener; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     String postResponse = ""; 
     try { 
      // url where the data will be posted 
      String postReceiverUrl = "http://server.com/Json/login.php"; 

      // HttpClient 
      HttpClient httpClient = new DefaultHttpClient(); 

      // post header 
      HttpPost httpPost = new HttpPost(postReceiverUrl); 

      // add your data 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
      nameValuePairs.add(new BasicNameValuePair("UserName", params[0])); 
      nameValuePairs.add(new BasicNameValuePair("Password", params[1])); 

      httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      // execute HTTP post request 
      HttpResponse response = httpClient.execute(httpPost); 
      HttpEntity resEntity = response.getEntity(); 

      postResponse = EntityUtils.toString(resEntity).trim(); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return postResponse; 
    } 

    @Override 
    protected void onPostExecute(String postResponse) { 
     if (postResponse.isEmpty() || postResponse.equals(ERROR_RESPONSE)) { 
      listener.onFailedLogin(postResponse); 
     } else { 
      listener.onSuccessfulLogin(postResponse); 
     } 
    } 
} 

Так, «doInBackground» возвращает ответ «onPostExecute» (который работает в потоке пользовательского интерфейса), и маршруты «» onPostExecute результат (успех или неудача) в MainActivity, который реализует «LogInListener» методы:

@Override 
public void onSuccessfulLogin(String response) { 
    // you have access to the ui thread here - do whatever you want on suscess 
    // I'm just assuming that you'd like to start that activity 
    Intent Hotels_btn_pressed = new Intent(this, Hotels.class); 
    startActivity(Hotels_btn_pressed); 
} 

@Override 
public void onFailedLogin(String response) { 
    Toast.makeText(MainActivity.this, 
      "Error! User does not exist", Toast.LENGTH_LONG).show(); 
} 

Я просто сказал, что это то, что вы хотели сделать на успех: начать новую деятельность и показать тост на неудачу.

+0

Спасибо за ваш совет !! Одна вещь, после того, как он отправляет назад ответ, приложение терпит неудачу ... Кажется, что он зависает, когда он пытается выполнить методы «LogInListener». –

+0

Не могли бы вы описать, какое исключение выбрано или что-то похожее? – Spiri

+0

Хотя я не переместил PostDataAsyncTask в новый файл (только чтобы сэкономить некоторое время), мне удалось получить результат и перейти дальше. Большое вам спасибо за вашу помощь! Хорошего дня!! –

Смежные вопросы