2013-05-26 2 views
0

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

Это код в главном потоке ..

if (loginBTN.getId() == ((Button) v).getId()) { 

    String emailId = loginField.getText().toString().trim(); 
    String password = passwordField.getText().toString().trim(); 

    postParameters.add(new BasicNameValuePair("username", emailId)); 
    postParameters.add(new BasicNameValuePair("password", password)); 

    try { 

     System.out.println("b4 response" + responseToString); 

     checkLogin(); 

     System.out.println("after response" + responseToString); 

     synchronized (this) { 

      while (isAvailable == false) { 

       wait(); 

      } 

      if (responseToString.equalsIgnoreCase("1")) { 

       statusLBL.setText("Login Successful..."); 

      } 

      else { 

       statusLBL.setText("Sorry Incorrect Username or Password..."); 

      } 
     } 

    } 

    catch (Exception e) { 

     statusLBL.setText(e.toString()); 
    } 

} 




private void checkLogin() { 

     Thread thread = new Thread(new Runnable() { 

      @Override 
      public void run() { 

       try { 

        HttpClient http = new DefaultHttpClient(); 
        HttpPost request = new HttpPost("http://example.org/api/android_gradhub/login_user.php"); 
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); 
        request.setEntity(formEntity); 
        HttpResponse response = http.execute(request); 
        HttpEntity entity = response.getEntity(); 

        // responseToString = EntityUtils.toString(entity); 

        synchronized (this) { 

         while (isAvailable == true) { 

          wait(); 

         } 

         responseToString = EntityUtils.toString(entity); 
         notifyAll(); 
        } 

        System.out.println("response " + responseToString); 
       } 

       catch (Exception e) { 

        e.printStackTrace(); 
       } 
      } 
     }); 

     thread.start(); 

    } 
+1

В чем проблема? –

+1

Каков ваш вопрос? – Daniel

+0

Синхронизация не работает. – user2421377

ответ

0

Удалить все ваши synhronization, а затем просто положить thread.join() в качестве последнего оператора в checkLogin. Это самый простой способ дождаться завершения потока, прежде чем продолжить.

Если вы хотите, чтобы решить, когда ждать (например, вы можете сделать другие вещи в основной программе, прежде чем нужно быть проверено Логин), то вы можете вернуть нить из checkLogin. Чем вы решаете, когда до join вернуться в свою основную программу. (т. е. изменения подписей на public Thread checkLogin, а последняя строка checkLogin становится return thread. Вернитесь в свою основную программу, позвоните Thread thread = checkLogin();, когда вы хотите дождаться завершения checkLogin - используйте thread.join(), вплоть до этой точки. Основной поток и поток checkLogin являются параллельными).

+0

Это сработало, но может помочь мне исправить мою синхронизацию. Я изучаю многопоточность, поэтому было бы очень полезно. – user2421377

+0

Зачем вам нужна синхронизация в вашем примере. Что такое спорный ресурс? Это поможет более реалистичный пример проблемы ** совместного ресурса **. – xagyg

+0

responseToString - спорный ресурс – user2421377

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