2016-10-13 3 views
0

Je développe une application où j'utilise une architecture propre. Dans le présentateur, quand quelque chose arrive à la méthode onCompleted, je dois appeler la fonction de l'activité principale. ceci est mon Présentateur:Comment appeler méthode d'activité de Presenter dans l'architecture propre?

public class CheckInPresenter implements Presenter { 

    UseCase postCheckInUseCase; 
    Context context; 

    @Inject 
    CheckInPresenter(@Named("putCheckIn") UseCase postCheckInUseCase){ 
     this.postCheckInUseCase = postCheckInUseCase; 
    } 

    public void initialize(){this.initializeCheckIn();} 
    public void initializeCheckIn(){this.putCheckIn();} 
    public void putCheckIn(){ 
     this.postCheckInUseCase.execute(new CheckInSubscriber()); 

    } 

    @Override 
    public void resume() { 

    } 

    @Override 
    public void pause() { 

    } 

    @Override 
    public void destroy() { 

    } 
    private final class CheckInSubscriber extends DefaultSubscriber<EventEntity>{ 
     @Override 
     public void onCompleted() { 

      Log.d("onCompleted", "OnCompleted"); 
     } 

     @Override 
     public void onError(Throwable e) { 
      Log.d("onError", "OnError: " + e.getMessage()); 
     } 

     @Override 
     public void onNext(EventEntity eventEntity) { 

      Log.d("onNext", "OnNext"); 
     } 
    } 
} 

Et ceci est ma fonction de MainActivity que je dois appeler:

public void getDataForToolbar() { 
     SharedPreferences sharedPreferences = getSharedPreferences(getResources().getString(R.string.Account_json), Context.MODE_PRIVATE); 
     final String account = sharedPreferences.getString(getResources().getString(R.string.account_json), null); 

     if (account != null) { 
      Gson gson = new Gson(); 
      mAccount = gson.fromJson(account, AccountModel.class); 

      for (CompanyModel com : mAccount.getCompanies()) { 
       String name = com.getName(); 
       company_name.setText(name); 
       logo_url = com.getLogo_url(); 
      } 
      if (logo_url == null || logo_url.isEmpty()) { 
       Picasso 
         .with(this) 
         .load(R.drawable.default_company) 
         .resize(70, 58) 
         .transform(new RoundedTransformation(8, 0)) 
         .into(toolbarImage); 
      } else { 
       picassoLoader(this, toolbarImage, logo_url); 
      } 
      String username = mAccount.getUsername(); 
      if(mAccount.getStatus()){ 
       aUsername.setText(username + "/" + getResources().getString(R.string.on_duty)); 
       aUsername.setBackgroundColor(ContextCompat.getColor(mContext, R.color.colorGreen)); 
      }else{ 
       aUsername.setText(username + "/" + getResources().getString(R.string.off_duty)); 
       aUsername.setBackgroundColor(ContextCompat.getColor(mContext, R.color.colorWhite)); 
      } 

     } 
    } 

Quelqu'un pourrait-il me aide comment appeler cette fonction dans ma méthode OnCompleted dans Presenter? Merci d'avance.

Répondre

0

Si vous souhaitez appeler une fonction d'activité à partir d'un autre objet, vous devrez passer la référence d'activité à cet objet. Cela signifie que vous devez ajouter le paramètre Activity au constructeur du présentateur.

Side note

Je sais que ce que vous implémentez est appelé une « architecture propre » dans de nombreux endroits (y compris les tutoriels officiels MVP par Google), mais vous pouvez lire mes messages sur la sujet afin d'avoir une vision alternative sur ce que "propre" sur Android devrait ressembler.

Why activities in Android are not UI elements

MVC and MVP architectural patterns in Android

0

Créer une interface IView et votre activité relative à la mettre en œuvre. Dans IView méthode create void getDataForToolbar();

Je vois @Inject annotation dans votre CheckInPresenter, donc si vous utilisez Dagger 2, vous mettez à jour le constructeur du module Dagger avec IView, créez une méthode de fournisseur pour elle et fournir pour CheckInPresenter dans ce module.

place IView dans le constructeur de CheckInPresenter et mettre à jour la méthode de fournisseur pour CheckInPresenter dans le module Dagger et initialisation du composant Dagger dans votre Activity.

Par exemple, il pourrait ressembler à ceci:

public class YourActivity implements IView { 
    ... 
} 

@Module 
public class YourModule { 

    private IView view; 

    public YourModule(IView view) { 
     this.view = view; 
    } 

    @Provides 
    public IView provideView() { 
     return view; 
    } 

    @Provides 
    @YourScope 
    public Presenter providePresenter() { 
     return new YourPresenter(view); 
    } 
} 

terminer juste votre présentateur existant et le module avec IView. Après cet appel dans votre onCompleted méthode view.getDataForToolbar().