2016-10-13 13 views
0

私はクリーンなアーキテクチャを使用しているアプリケーションを開発しています。プレゼンターで、何かがメソッドonCompletedに来るとき、私はメインアクティビティから関数を呼び出さなければなりません。CleanメソッドのPresenterからActivityメソッドを呼び出す方法は?

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"); 
     } 
    } 
} 

そして、これは私が呼び出す必要があることMainActivityからの私の関数である: これは私のプレゼンターである

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)); 
      } 

     } 
    } 

誰かがプレゼンターの私onCompletedメソッドにこの関数を呼び出す方法を私を助けてもらえますか?前もって感謝します。

答えて

0

あるアクティビティの関数を別のオブジェクトから呼び出す場合は、そのオブジェクトへのアクティビティの参照を渡す必要があります。つまり、プレゼンターのコンストラクターにActivityパラメーターを追加する必要があります。

サイドノート

私は何を実装しようとしていること(Googleによる公式MVPのチュートリアルを含む)多くの場所で「クリーンアーキテクチャ」と呼ばれていることを知っている、しかし、あなたが私の記事を読みたいと思うかもしれませんAndroidの「きれいな」ものがどのように見えるかについての別の見解を得るために、件名を教えてください。

Why activities in Android are not UI elements

MVC and MVP architectural patterns in Android

0

は、インタフェースたIViewを作成し、それを実装するために、あなたの活動を行います。 IViewので は、私はあなたのCheckInPresenter@Inject注釈を参照してください方法void getDataForToolbar();

作成するので、あなたはダガー2を使用している場合は、あなたにたIViewとダガーモジュールのコンストラクタを更新し、それのためのプロバイダメソッドを作成して、このモジュールのCheckInPresenterのためにそれを提供しています。あなたActivityにダガーモジュールとダガーコンポーネントの初期化にCheckInPresenterCheckInPresenterため、更新プロバイダ方法のコンストラクタで

プレイスIView。例えば

、それは次のようになります。

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); 
    } 
} 

ちょうどIViewの持つ既存のプレゼンターとモジュールを完了する。 onCompletedメソッドview.getDataForToolbar()でその呼び出し後。

関連する問題