JavaRush /Блоги Java /Random-TG /MVP дар Android барои хурдсолон

MVP дар Android барои хурдсолон

Дар гурӯҳ нашр шудааст
Вақте ки ман саёҳати худро ҳамчун як таҳиягари Android оғоз кардам, калимаҳои "Архитектураи замимаҳои мобилӣ" маро ба ҳайрат оварданд, Google ва мақолаҳо дар бораи Ҳабре маро ба депрессияи боз ҳам бештар бурд - ман ба китоб нигоҳ мекунам ва ҳеҷ чизро намебинам. Ман фикр мекунам, ки агар шумо ин мақоларо хонда истода бошед, шумо аллакай ин расмро на як маротиба омӯхтаед ва кӯшиш кардаед, ки чӣ рӯй дода истодааст: MVP дар Android барои хурдсолон - 1Мушкилоти дарки равиши меъморӣ дар рушди мобилӣ, ба назари ман, дар абстрактии худи меъморӣ аст. Ҳар як таҳиягар диди худро дар бораи чӣ гуна дуруст татбиқ кардани ин ё он намуна дорад. Намунаҳои бештар ё камтар аз татбиқи MVP дар бахши англисзабони Интернет пайдо шуданд, ки ин тааҷҷубовар нест. Биёед мухтасар дида бароем, ки чӣ аст ва ба мисол мегузарем. Модели - сатҳи маълумот. Ман истифодаи истилоҳи "мантиқи тиҷорат"-ро дӯст намедорам, аз ин рӯ дар замимаҳои худ ман онро репозиторий меномам ва он бо пойгоҳи додаҳо ва шабака муошират мекунад. Намоиш — сатҳи намоиш. Он Фаъолият , Фрагмент ё Намоиши фармоишӣ хоҳад буд , агар ба шумо рақс бо танбур ва муошират бо давраи ҳаёт маъқул набошад. Ёдовар мешавам, ки дар аввал ҳама замимаҳои Android ба сохтори MVC тобеъанд , ки дар он контроллер фаъолият ё фрагмент аст . Баранда қабати байни Намоиш ва Модел аст. Намоиш воқеаҳоеро, ки бо он рух медиҳанд, интиқол медиҳад, баранда онҳоро коркард мекунад, агар лозим бошад, ба Модел дастрасӣ пайдо мекунад ва маълумотро ба Намоиш барои намоиш бармегардонад. Дар робита ба Android ва як мисоли мушаххас, ман қисми муҳимро қайд мекунам - Шартнома. Ин интерфейсест, ки тамоми муносибатҳои байни ҷузъҳои дар боло зикршударо тавсиф мекунад. Барои ҷамъбасти қисми назариявӣ:
  • View дар бораи Presenter медонад;
  • Баранда дар бораи Намоиш ва Модел (Репозиторий) медонад;
  • Модели худ;
  • Шартнома муносибатҳои байни онҳоро танзим мекунад.
Дар асл, худи мисол, барои соддагии таҷриба, бо пахш кардани тугма, мо сатрро аз пойгоҳи додаҳо бор мекунем ва онро дар TextView намоиш медиҳем . Масалан, дар база руйхати ресторанхои бехтарини шахр мавчуд аст. Биёед бо шартнома оғоз кунем: Биёед интерфейс эҷод кунем MainContract:
public interface MainContract {
    interface View {
        void showText();
    }

    interface Presenter {
        void onButtonWasClicked();
        void onDestroy();
    }

    interface Repository {
        String loadMessage();
    }
}
Ҳоло, мо танҳо 3 ҷузъи барномаи ояндаи худро таъкид карда истодаем ва онҳо чӣ кор хоҳанд кард. Минбаъд мо анборро тавсиф мекунем:
public class MainRepository implements MainContract.Repository {

    private static final String TAG = "MainRepository";
    @Override
    public String loadMessage() {
        Log.d(TAG, "loadMessage()");
        /** Здесь обращаемся к БД or сети.
         * Я специально ничего не пишу, чтобы не загромождать пример
         * DBHelper'ами и прочими не относяшимеся к теме an objectми.
         * Поэтому я буду возвращать строку Сосисочная =)
         */
        return "Сосисочная у Лёхи»;
    }
}
Бо он ҳама чиз равшан аст, танҳо бор кардан ва борфарорӣ кардани маълумот. Оянда баранда аст:
public class MainPresenter implements MainContract.Presenter {
    private static final String TAG = "MainPresenter";

    //Компоненты MVP applications
    private MainContract.View mView;
    private MainContract.Repository mRepository;

    //Сообщение
    private String message;


    //Обрати внимание на аргументы конструктора - мы передаем экземпляр View, а Repository просто создаём конструктором.
    public MainPresenter(MainContract.View mView) {
        this.mView = mView;
        this.mRepository = new MainRepository();
        Log.d(TAG, "Constructor");
    }

    //View сообщает, что кнопка была нажата
    @Override
    public void onButtonWasClicked() {
        message = mRepository.loadMessage();
        mView.showText(message);
        Log.d(TAG, "onButtonWasClicked()");
    }

    @Override
    public void onDestroy() {
        /**
         * Если бы мы работали например с RxJava, в этом классе стоило бы отписываться от подписок
         * Кроме того, при работе с другими методами асинхронного андроида,здесь мы боремся с утечкой контекста
         */

        Log.d(TAG, "onDestroy()");
    }
}
Дар хотир доред, ки ман дар бораи рақс бо танбур ва давраи ҳаёт навишта будам? Баранда то он даме, ки Намоиши он зинда аст, ҳангоми таҳияи сенарияҳои мураккаби корбар, ман ба шумо маслиҳат медиҳам, ки ҳама зангҳои бозбинии Намоишро дар Presenter такрор кунед ва дар лаҳзаҳои мувофиқ ба онҳо занг занед, то давраи ҳаёти Фаъолият/Фрагментро такрор кунед, то сари вақт дарк кунед, ки чӣ лозим аст. бо маълумоте, ки дар айни замон дар «интерлятор» овезон аст, анҷом дода шавад. Ва ниҳоят, Намоиш:
public class MainActivity extends AppCompatActivity implements MainContract.View {

    private static final String TAG = "MainActivity";

    private MainContract.Presenter mPresenter;

    private Button mButton;

    private TextView myTv;

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

        //Создаём Presenter и в аргументе передаём ему this - эта Activity расширяет интерфейс MainContract.View
        mPresenter = new MainPresenter(this);

        myTv = (TextView) findViewById(R.id.text_view);
        mButton = (Button) findViewById(R.id.button);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPresenter.onButtonWasClicked();
            }
        });
        Log.d(TAG, "onCreate()");
    }

    @Override
    public void showText(String message) {
        myTv.setText(message);
        Log.d(TAG, "showMessage()");
    }

    //Вызываем у Presenter метод onDestroy, чтобы избежать утечек контекста и прочих неприятностей.
    @Override
    public void onDestroy() {
        super.onDestroy();
        mPresenter.onDestroy();
        Log.d(TAG, "onDestroy()");
    }
}
Чӣ гап шудааст?
  • Фаъолият, ки бо номи Намоиш низ маълум аст, onCreate()дар усул як мисоли Presenter эҷод мекунад ва худро ба созандаи он мегузарад.
  • Вақте ки презентатсия сохта мешавад, он ба таври возеҳ Намоишро қабул мекунад ва як мисоли анбориро эҷод мекунад (дар омади гап, онро Singleton кардан мумкин аст)
  • Вақте ки тугма пахш карда мешавад, Намоиш барандаро мекӯбад ва мегӯяд: "Тугма пахш карда шуд".
  • Баранда ба репозиторий рӯй медиҳад: "Ин аҳмақро барои ман зеркашӣ кунед."
  • Репозиторий "мавод" -ро ба баранда бор мекунад ва мерасонад.
  • Баранда ба Намоиш рӯй медиҳад: "Инак маълумот барои шумост, онро кашед"
Хамин аст, бачахо. PS Муҳим аст, ки масъулиятҳо байни ҷузъҳо дақиқ муайян карда шаванд. Масалан, дар яке аз лоиҳаҳои омӯзишии ман, ҳангоми пахш кардани тугма, тағир додани маълумот дар базаи маълумот зарур буд. Модели аз ҷониби як синфи POJO тавсиф карда шуд, Ман маълумот дар бораи ҷойгиршавии манзараи, ки барои маълумот дар бораи an objectи дар экран масъул аст, гузашт, Presenter барои ин an object дар рӯйхат ҷустуҷӯ ва фиристодани он ба репозиторий навишта. Оё ҳама чиз мантиқӣ ба назар мерасад? Аммо мураббии ман ба ин нукта ишора кард: Репозиторий бояд ТАНҲО бо навиштан ва хондан машғул шавад, он набояд маълумоти заруриро аз POJO кашад ва қарор диҳад, ки чӣ бояд нависад. Баранда бояд ба ӯ танҳо маълумоте диҳад, ки сабт кунад, на бештар. Барои татбиқи меъморӣ чаҳорчӯбаи қатъӣ вуҷуд надорад: таҷриба кунед, кӯшиш кунед, ҷустуҷӯ кунед, ки барои шумо шахсан мувофиқ аст. Ва фаромӯш накунед, ки рафиқони калони худро дар баррасии code нишон диҳед =) Намуна дар GitHub дастрас аст: https://github.com/admitrevskiy/MVP_Example
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION