2016-10-13 3 views
0

Я разрабатываю приложение, где я использую чистую архитектуру. В презентаторе, когда что-то приходит к методу onCompleted, я должен вызывать функцию из Основной активности. это мой Presenter:Как вызвать метод активности из Presenter в чистой архитектуре?

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 метода в Presenter? Заранее спасибо.

ответ

0

Если вы хотите вызвать функцию Activity из другого объекта, вам необходимо передать ссылку Activity на этот объект. Это означает, что вам нужно добавить параметр Activity в конструктор презентатора.

Примечание стороны

Я знаю, что вы реализуете называются «чистой архитектурой» во многих местах (в том числе официальных ПМК учебников по Google), но вы можете прочитать мои посты на чтобы получить альтернативное представление о том, что должно выглядеть «чистым» на Android.

Why activities in Android are not UI elements

MVC and MVP architectural patterns in Android

0

Создание интерфейса IView и сделать вашу активность для его реализации. В IView создать метод void getDataForToolbar();

Я вижу @Inject аннотаций в вашем CheckInPresenter, так что если вы используете Dagger 2, обновить вам конструктор Dagger модуля с IView, создать метод провайдера для него и предоставить его для CheckInPresenter в этом модуле.

Место IView в конструкторе CheckInPresenter и обновления метода поставщика для CheckInPresenter в Dagger модуля и инициализации компонента Dagger в вашем Activity.

Например, это может выглядеть следующим образом:

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

Просто заполните существующий Presenter и модуль с IView. После этого звонка в вашем onCompleted методе view.getDataForToolbar().

Смежные вопросы