2013-05-26 166 views
0

Android設計不允許網絡在主線程上強制它,但它不是一個好的做法。所以我想同步主線程和另一個線程,以便我可以從數據庫獲取用戶身份驗證的響應。我同步不工作..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。回到主程序中,當您想等待checkLogin完成時,請撥Thread thread = checkLogin(); - 使用thread.join(),直到主線程和checkLogin線程同時爲止。

+0

這工作,但可以幫助我解決我的同步問題我正在學習多線程,所以這將是一個很好的幫助.. – user2421377

+0

爲什麼你需要在你的例子同步。什麼是有爭議的資源? **共享資源**問題的更現實的例子會有所幫助。 – xagyg

+0

responseToString是有爭議的資源 – user2421377