2016-06-25 14 views
0

私はバックエンドレスを使用して自分のアプリケーションユーザーのデータを保存しています。バックエンドレスには、あなたの電子メールまたはユーザー名を一意にするオプションしかありません。私は自分のユーザー名フィールドを一意にして、ユーザーがログインに使用するものです。電子メールは再利用できるので、電子メールが存在するかどうかを確認するために登録前にメソッドを作成しています。 Android - タスクが実行されていないときに実行されていません

この

createUser方法で、これはオフに開始され、それが起動するとすぐに、電子メールの可用性をチェックするためにメソッドを呼び出します:

private boolean isAvailable; 
private boolean isEmailAvailable(String email) { 
    isAvailable = false; 

    String whereClause = "email = '" + email + "'"; 
    BackendlessDataQuery dataQuery = new BackendlessDataQuery(); 
    dataQuery.setWhereClause(whereClause); 
    Backendless.Persistence.of(BackendlessUser.class).find(dataQuery, new AsyncCallback<BackendlessCollection<BackendlessUser>>() { 
     @Override 
     public void handleResponse(BackendlessCollection<BackendlessUser> userBackendlessCollection) { 
      isAvailable = userBackendlessCollection.getData().isEmpty(); 
     } 

     @Override 
     public void handleFault(BackendlessFault backendlessFault) { 
      Toast.makeText(CreateAccountActivity.this, backendlessFault.getMessage(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    return isAvailable; 
} 
:これは、電子メールの利用可能性をチェックする方法である

private void createUser() { 
    showProgressDialog(); 

    if (isEmailAvailable(inputEmail.getText().toString().trim())) { 
     BackendlessUser user = new BackendlessUser(); 
     user.setProperty(BackendSettings.USERNAME_KEY, inputUsername.getText().toString().trim()); 
     user.setEmail(inputEmail.getText().toString().trim()); 
     user.setPassword(inputPassword.getText().toString()); 

     Backendless.UserService.register(user, new AsyncCallback<BackendlessUser>() { 
      @Override 
      public void handleResponse(BackendlessUser backendlessUser) { 
       hideProgressDialog(); 
       Toast.makeText(CreateAccountActivity.this, BackendSettings.REGISTER_SUCCESS_MESSAGE, Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(CreateAccountActivity.this, MainActivity.class); 
       startActivity(intent); 
       finish(); 
      } 

      @Override 
      public void handleFault(BackendlessFault backendlessFault) { 
       hideProgressDialog(); 
       String errorCode = backendlessFault.getCode(); 
       String errorMessage; 
       switch (errorCode) { 
        case "3040": 
         errorMessage = BackendSettings.ERROR_3040; 
         break; 
        case "3033": 
         errorMessage = BackendSettings.ERROR_3033; 
         break; 
        default: 
         errorMessage = "An unknown error occurred. Try again."; 
       } 
       Toast.makeText(CreateAccountActivity.this, errorMessage, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } else { 
     hideProgressDialog(); 
     Toast.makeText(CreateAccountActivity.this, BackendSettings.ERROR_EMAIL_TAKEN, Toast.LENGTH_SHORT).show(); 
    } 
} 

さて、電子メールがすでに送信されているというメッセージが表示されることがあります。だから私はのhandleResponseメソッドにToastメッセージを入れることに決めました。私は電子メールが利用可能かどうかを印刷しました。だから私は最初にcreateUserのelse節からメッセージを受け取りました。電子メールは既に取られていて、その後私はisEmailAvailableメソッドからメッセージを受け取りました。後でisEmailAvailableメソッドが実行されているようです。何がうまくいかないのか分かりません。

答えて

1

Woa! エラーはisEmailAvailableメソッドにあります。

非同期メソッドを検索します。 それはそれのように機能します:あなたはそれを呼び出す、実際に結果が出る前にすぐに動作して戻ります。 その後、コールバックメソッドを呼び出します。だから、あなたがそうするとき

return isAvailable; 

isAvailableはまだ変更されていないので、常にfalseです。

非同期で作業する必要があります。 1. Backendless.Persistence.of(BackendlessUser.class).find(...) を呼び出します。2.応答を待ちます。あなたは、メソッドdoCreateUserを作成

public void handleResponse(BackendlessCollection<BackendlessUser> userBackendlessCollection) { 
     isAvailable = userBackendlessCollection.getData().isEmpty(); 
    } 

3.ちょうど

isAvailable = userBackendlessCollection.getData().isEmpty(); 

後の仕事の残りを行いだけで結果を知っている「場合、」それにあなたの体を入れてのhandleResponseからそれを呼び出します。 、isAvailable = userBackendlessCollection.getData()の後に。isEmpty();このコード

使用:

private void createUser() { 
     showProgressDialog(); 
     checkEmailAvailable(inputEmail.getText().toString().trim()); 
    } 

    private void checkEmailAvailable(String email) { 
     String whereClause = "email = '" + email + "'"; 
     BackendlessDataQuery dataQuery = new BackendlessDataQuery(); 
     dataQuery.setWhereClause(whereClause); 
     Backendless.Persistence.of(BackendlessUser.class).find(dataQuery, new AsyncCallback<BackendlessCollection<BackendlessUser>>() { 
      @Override 
      public void handleResponse(BackendlessCollection<BackendlessUser> userBackendlessCollection) { 
       isAvailable = userBackendlessCollection.getData().isEmpty(); 
       if (isAvailable){ 
        doCreateuser(); 
       } else { 
        hideProgressDialog(); 
        Toast.makeText(CreateAccountActivity.this, BackendSettings.ERROR_EMAIL_TAKEN, Toast.LENGTH_SHORT).show(); 
       } 
      } 

      @Override 
      public void handleFault(BackendlessFault backendlessFault) { 
       Toast.makeText(CreateAccountActivity.this, backendlessFault.getMessage(), Toast.LENGTH_SHORT).show(); 
       hideProgressDialog(); 
      } 
     }); 
    } 

    private void doCreateuser(){ 
     BackendlessUser user = new BackendlessUser(); 
     user.setProperty(BackendSettings.USERNAME_KEY, inputUsername.getText().toString().trim()); 
     user.setEmail(inputEmail.getText().toString().trim()); 
     user.setPassword(inputPassword.getText().toString()); 

     Backendless.UserService.register(user, new AsyncCallback<BackendlessUser>() { 
      @Override 
      public void handleResponse(BackendlessUser backendlessUser) { 
       hideProgressDialog(); 
       Toast.makeText(CreateAccountActivity.this, BackendSettings.REGISTER_SUCCESS_MESSAGE, Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(CreateAccountActivity.this, MainActivity.class); 
       startActivity(intent); 
       finish(); 
      } 

      @Override 
      public void handleFault(BackendlessFault backendlessFault) { 
       hideProgressDialog(); 
       String errorCode = backendlessFault.getCode(); 
       String errorMessage; 
       switch (errorCode) { 
        case "3040": 
         errorMessage = BackendSettings.ERROR_3040; 
         break; 
        case "3033": 
         errorMessage = BackendSettings.ERROR_3033; 
         break; 
        default: 
         errorMessage = "An unknown error occurred. Try again."; 
       } 
       Toast.makeText(CreateAccountActivity.this, errorMessage, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
+0

私はあなたが私のアカウントボタンを作成することを言っている、申し訳ありませんが、私が代わりに '' createUser'のisEmailAvailable'メソッドを呼び出す必要がありますか? –

+0

最初にisEmailAvailableを呼び出す必要があります。そして去る。後で、isEmailAvailableへのコールバックが呼び出されると、あなたはそのことを行うべきです。 – babay

+0

変更されたコードを追加しました。今は非同期です。 – babay

0

Backendlessへの呼び出しはasynchronであり、あなたの方法は、常に値isAvailableは(ここでは偽)で初期化されて返す理由thatsの。適切な値を返す前にブロックするには、たとえばSemaphoreと同期する必要があります。

private boolean isEmailAvailable(String email) { 
boolean isAvailable = false; 
String whereClause = "email = '" + email + "'"; 
final Semaphore s = new Semaphore(0); 
BackendlessDataQuery dataQuery = new BackendlessDataQuery(); 
dataQuery.setWhereClause(whereClause); 

Backendless.Persistence.of(BackendlessUser.class).find(dataQuery, new AsyncCallback<BackendlessCollection<BackendlessUser>>() { 
    @Override 
    public void handleResponse(BackendlessCollection<BackendlessUser> userBackendlessCollection) { 
     isAvailable = userBackendlessCollection.getData().isEmpty(); 
     s.release(); 
    } 

    @Override 
    public void handleFault(BackendlessFault backendlessFault) { 
     Toast.makeText(CreateAccountActivity.this, backendlessFault.getMessage(), Toast.LENGTH_SHORT).show(); 
     s.release(); 
    } 
}); 
try{ 
    s.aquire(); 
}catch(Exception e){ 
} 
return isAvailable; 

}

+0

メインスレッドを待つのは悪い考えです。 – babay

+0

これは、アプリケーションをフリーズします。 –

関連する問題