2017-10-11 22 views
0

this投稿やその他のブログ記事によると、MVPアンドロイドアプリのプレゼンターにアクティビティコンテキストを持たせるのは悪いことです。プレゼンターのメソッドの1つがアクティビティーコンテキストを必要とする場合、プレゼンターのアクティビティーコンテキストを削除しても、プレゼンターがそれを実行するために必要な作業を実行するにはどうすればよいですか?Presenterでアクティビティコンテキストを削除するにはどうすればよいですか?

このアクティビティでは、プレゼンターのfirebaseAuthWithGoogleメソッドを呼び出します。発表者は、アクティビティ,ビューおよびFirebaseAuthをコンストラクタに渡すことによって初期化されます。

public class GoogleSignInActivity extends AppCompatActivity implements 
     GoogleApiClient.OnConnectionFailedListener, View.OnClickListener, GoogleSignInView { 
    private static final String TAG = "SignInActivity"; 
    private static final int RC_SIGN_IN = 9001; 

    private SignInButton mSignInButton; 

    private GoogleApiClient mGoogleApiClient; 

    // Firebase instance variables 
    private FirebaseAuth mFirebaseAuth; 

    private GoogleSignInPresenter googleSignInPresenter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_google_sign_in); 

     mSignInButton = (SignInButton) findViewById(R.id.btn_sign_in); 
     mSignInButton.setOnClickListener(this); 

     // Configure Google Sign In 
     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestIdToken(getString(R.string.default_web_client_id)) 
       .requestEmail() 
       .build(); 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 

     // Initialize FirebaseAuth 
     mFirebaseAuth = FirebaseAuth.getInstance(); 

     googleSignInPresenter = new GoogleSignInPresenter(this, this, mFirebaseAuth); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.btn_sign_in: 
       googleSignInPresenter.onSignInClick(); 
       break; 
      default: 
       return; 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == RC_SIGN_IN) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      if (result.isSuccess()) { 
       GoogleSignInAccount account = result.getSignInAccount(); 
       googleSignInPresenter.firebaseAuthWithGoogle(account); 
      } else { 
       Log.e(TAG, "Google Sign-In failed."); 
      } 
     } 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     Log.d(TAG, "onConnectionFailed:" + connectionResult); 
     Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void startSignInIntent() { 
     Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
     startActivityForResult(signInIntent, RC_SIGN_IN); 
    } 

    @Override 
    public void startMainActivity() { 
     startActivity(new Intent(GoogleSignInActivity.this, MainActivity.class)); 
     finish(); 
    } 


} 

このプレゼンターにおける方法firebaseAuthWithGoogleはaddOnCompleteListenerでActivityコンテキストを必要とします。

public class GoogleSignInPresenter { 
    public static final String TAG = "GoogleSignInPresenter"; 

    private GoogleSignInView googleSignInView; 
    private FirebaseAuth firebaseAuth; 
    private GoogleSignInActivity googleSignInActivity; 

    public GoogleSignInPresenter(GoogleSignInActivity googleSignInActivity, GoogleSignInView googleSignInView, FirebaseAuth firebaseAuth) { 
     this.googleSignInActivity = googleSignInActivity; 
     this.googleSignInView = googleSignInView; 
     this.firebaseAuth = firebaseAuth; 
    } 

    public void onSignInClick() { 
     googleSignInView.startSignInIntent(); 
    } 


    public void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
     Log.d(TAG, "firebaseAuthWithGooogle:" + acct.getId()); 
     AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
     firebaseAuth.signInWithCredential(credential) 
       .addOnCompleteListener(googleSignInActivity, new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); 
         if (!task.isSuccessful()) { 
          Log.w(TAG, "signInWithCredential", task.getException()); 
         } else { 
          googleSignInView.startMainActivity(); 
         } 
        } 
       }); 
    } 
} 

答えて

1

アクティビティインスタンスを削除するだけで済みます。

.addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); 
        if (!task.isSuccessful()) { 
         Log.w(TAG, "signInWithCredential", task.getException()); 
        } else { 
         googleSignInView.startMainActivity(); 
        } 
       } 
      }); 

これを読む:https://developers.google.com/android/guides/tasks

+0

THX、素敵な発見が、私は、このリスナーが活動になりたい場合は、それはonStopに削除されますので、スコープを、私はまだアクティビティインスタンスが必要になります。これはプレゼンターでアクティビティが必要な場合の例です。私はそれが機能するためにプレゼンターでアクティビティが必要な場合、何をすべきか分かりません。 –

関連する問題