2014-04-03 65 views
0

我有一個有趣的問題,我從未在編程之前遇到過。我有一個onClickListener,它執行了大量的用戶名和密碼檢查(確保用戶名長度適當,沒有被採取等)。我使用的是MobDB,而且我使用的條件語句會在用戶名已經存在的情況下返回一行。問題是監聽器跳過數據庫並進行最後的檢查,如果一切正常,請將新的用戶名和密碼發佈到我的數據庫中。在跳過上一次檢查前,如何讓它等待數據庫的響應?Android在完成語句之前沒有等待數據庫響應

下面是相關代碼:

usernamecheck3 = true; 
        MobDB.getInstance().execute(APP_KEY, null, rd, null, false, new MobDBResponseListener() { 

         @Override public void mobDBSuccessResponse() { 
          usernamecheck3 = false; 
          Log.e("mobdbSuccess:", "success"); 
         }   

         @Override public void mobDBResponse(Vector<HashMap<String, Object[]>> row) { 
         }   

         @Override public void mobDBResponse(String jsonObj) { 
          /*Log.e("mobdbSuccess:", "jsonObj"); 
          Log.e("mobdbSuccess:", jsonObj); 
          JSONObject mainObject; 
          try { 
           mainObject = new JSONObject(jsonObj); 
           // need to parse the json object. 
          } catch (JSONException e1) { 

           e1.printStackTrace(); 
          } */ 
         } 

         @Override public void mobDBFileResponse(String fileName, byte[] fileData) { 
         //get file name with extension and file byte array 
         }   

         @Override public void mobDBErrorResponse(Integer errValue, String errMsg) { 
          usernamecheck3 = false; 
          Log.e("doesnt", "work"); 
         } 
        }); 
        if(usernamecheck3 == false){ 
         Toast.makeText(getApplicationContext(), "Username is taken, please choose another", Toast.LENGTH_SHORT).show(); 
        } 

基本上支票總是返回true,然後將logcat中說mobdbSuccess:成功,這應該已經設置了布爾爲false。

謝謝。

回答

0

MobDBResponseListener正在另一個線程上執行。這裏發生的事情是處理被拆分,而一個線程正在執行查詢,您在其上添加了偵聽器的主線程跳過驗證。你最好的選擇是將驗證放在MobDBResponseListener中,在mobDBResponse方法中。 嘗試調試您的代碼和調用,Listener可能正在使用異步任務。如果是這樣,你可以從響應方法中做任何你喜歡的事情,因爲它會在主線程中再次執行。否則,您應該查看處理線程執行的解決方案,如Handlers

相關問題