2016-07-08 4 views
0

私は自分のREST APIで認証されたAndroidアプリケーションのログイン部分を書き込もうとしています。これは私が現在REST APIへの非同期ログインの処理方法

LogInTaskブール関数

boolean LogInTask(String username, String password){ 



    AuthOrNot.setCurrent(true); 
    Log.wtf("START", "" + AuthOrNot.getCurrent()); 

    UserAPI.Factory.getInstance().authenticateUser("testuser", "password").enqueue(new Callback<TokenJSON>() { 
     @Override 
     public void onResponse(Call<TokenJSON> call, Response<TokenJSON> response) { 

      try{ 
       String token = response.body().getToken(); 
       Log.wtf("WORKS",""+ token); 

       AuthOrNot.setCurrent(false); 

       Log.wtf("AUTH", "" + AuthOrNot.getCurrent()); 


      }catch (NullPointerException t){ 
       Log.wtf("NO", "Didn't work, most likely incorrect username+password"); 
       AuthOrNot.setCurrent(false); 
       t.printStackTrace(); 
      } 
     } 

     @Override 
     public void onFailure(Call<TokenJSON> call, Throwable t) { 
      Log.wtf("FAIL",""+t.getMessage()); 
      AuthOrNot.setCurrent(false); 
     } 
    }); 

    Log.wtf("AUTH", "" + AuthOrNot.getCurrent()); 

    return AuthOrNot.getCurrent(); 
} 

私はこれは私が今ここにいる理由である、おそらくこれを行うについて行くための最良の方法ではありません知っているものです。起こっているのは、ネットワーク要求が1秒〜2秒かかることです。コードはすでに下にあります。AuthoOrNot.getCurrent()== true。これは、ユーザ名+パスワードコンボは正しいです。

+0

は、コールバックを使用します:)

はまた、クラス定義はここで見つけることができます修正されました。 –

+0

リスナーを作成して、onresponseの最後に発生させます。コールバックでcehckを実行して他のアクティビティに移動 – user6547359

+0

組み込みのメソッドの1つである必要がありますか、自分で作成する必要がありますどのようなリスナーですか?また、正確に 'コールバック'はどこですか? – ethanzh

答えて

2

インターフェイスを作成して、コールバックとして使用することができます。インタフェースは、次のようになります。そして、

void LogInTask(String username, String password, final LoginCallback callback){ 
// this isnt't needed: AuthOrNot.setCurrent(true); 
//Log.wtf("START", "" + AuthOrNot.getCurrent()); 

UserAPI.Factory.getInstance().authenticateUser("testuser", "password").enqueue(new Callback<TokenJSON>() { 
    @Override 
    public void onResponse(Call<TokenJSON> call, Response<TokenJSON> response) { 

     try{ 
      String token = response.body().getToken(); 
      Log.wtf("WORKS",""+ token); 

      callback.onLoginSuccess(); 

      //Log.wtf("AUTH", "" + AuthOrNot.getCurrent()); 


     }catch (NullPointerException t){ 
      Log.wtf("NO", "Didn't work, most likely incorrect username+password"); 
      callback.onLoginFailure(); 
      t.printStackTrace(); 
     } 
    } 

    @Override 
    public void onFailure(Call<TokenJSON> call, Throwable t) { 
     Log.wtf("FAIL",""+t.getMessage()); 
     callback.onLoginFailure(); 
    } 
}); 

//Log.wtf("AUTH", "" + AuthOrNot.getCurrent()); 

//nothing to return; 
} 

あなたはLogInTaskメソッド呼び出しているところはどこでも:

LoginTask("user", "password", new LoginCallback() { 
    void onLoginSuccess(){ 
    //at this point you are logged in 
    } 
    void onLoginFailure(){ 
    //at this point the login has failed 
    } 
}); 

PS:メソッド名を

public Interface LoginCallback{ 
    void onLoginSuccess(); 
    void onLoginFailure(); 
} 

は、このような何かにあなたのコードを更新します"LoginTask()"は実際には "loginTask()"である必要があります。

+0

LogInTaskメソッドの3番目のパラメータとしてコールバックを追加する必要がありますか? – ethanzh

+0

申し訳ありません、はい、私はそれを追加するつもりでしたが、忘れました。私は私の答えを編集します。 –

+0

心配はいりません!すべてが今働いています。ありがとうございました。私は「答えた」とマークします – ethanzh

2

これはダニエルChiriacの答えにコメントする必要がありますが、私はコメントするの評判を持っていないので:

あなたは別のものを追加することにより、メソッドのシグネチャを変更することはできませんretrofit2コールバッククラスで定義されたメソッドをonResponse上書きするを持っているので、パラメター。

代わりにLoginTaskメソッドのメソッドパラメータとして "コールバック"を使用します。

編集:https://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html

+0

はい、そこに追加するつもりでした。私が間違った方法でそれを追加したことを認識していませんでした。良い点。 –

関連する問題