2013-05-26 2 views
0

안드로이드는 설계 상으로 메인 쓰레드에서 네트워크를 허용하지 않지만 강제적 일 수는 있지만 좋은 습관은 아닙니다. 따라서 사용자 인증을 위해 데이터베이스에서 응답을받을 수 있도록 주 스레드와 다른 스레드를 동기화하려고합니다. 내 동기는 checkLogin의 마지막 문으로 thread.join()를 넣어 다음 synhronization을 모두 제거 .. 안드로이드의 메인 스레드와 다른 스레드간에 동기화

주 스레드에서 코드입니다 ..

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

작동하지 않습니다. 계속하기 전에 스레드가 완료 될 때까지 기다리는 가장 간단한 방법입니다. 당신은 당신이 checkLogin에서 스레드을 반환 할 수 있습니다 (당신이 로그인이 확인 될 필요가 전에 주 프로그램에 다른 물건을 수행 할 수 있습니다처럼) 기다려야 할시기를 결정하려면

. 메인 프로그램에서 join으로 돌아갈시기를 결정하십시오. (즉, public Thread checkLogin으로 서명이 변경되고 checkLogin의 마지막 줄이 return thread이됩니다. 메인 프로그램으로 돌아가서 checkLogin이 끝날 때까지 기다리려면 Thread thread = checkLogin();으로 전화하십시오. thread.join()을 사용하면 그 때까지 메인 스레드와 checkLogin 스레드가 동시에 실행됩니다).

+0

그게 효과가 있지만 내 동기화를 해결할 수 있습니다. 나는 멀티 스레딩을 배우므로 큰 도움이 될 것입니다. – user2421377

+0

당신의 경우에 동기화가 필요한 이유는 무엇입니까? 논쟁의 여지가있는 자료는 무엇입니까? ** 현실적인 ** 공유 리소스 ** 문제의 예가 도움이 될 것입니다. – xagyg

+0

responseToString은 논쟁의 여지가있는 리소스입니다. – user2421377

관련 문제