JavaRush /Java Blog /Random-TK /Kiçijikler üçin Android-de MVP

Kiçijikler üçin Android-de MVP

Toparda çap edildi
“Android” döredijisi hökmünde syýahatymy başlanymda, “Mobil programma arhitekturasy” sözleri meni gaty geň galdyrdy, Google we Habre baradaky makalalar meni hasam depressiýa saldy - kitaba seredýärin we hiç zat göremok. Meniň pikirimçe, bu makalany okaýan bolsaňyz, bu suraty eýýäm birnäçe gezek öwrendiňiz we bolup geçýän zatlara düşünmäge synanyşdyňyz: Kiçijikler üçin Android-de MVP - 1Meniň pikirimçe, ykjam ösüşde binagärlik çemeleşmesine düşünmek meselesi arhitekturanyň abstraktlygyndadyr. Her bir işläp düzüjiniň bu ýa-da beýleki görnüşi nädip dogry durmuşa geçirmelidigi barada öz düşünjesi bar. MVP-ni durmuşa geçirmegiň has oňat mysallary internetiň iňlis dilinde gürleýän sektorynda tapyldy, bu geň däldir. Nämäniň nämedigine gysgaça seredeliň we bir meselä geçeliň. Model - maglumat derejesi. “Iş logikasy” adalgasyny ulanmagy halamok, şonuň üçin programmalarymda “ Ammar” diýýärin we maglumatlar bazasy we tor bilen aragatnaşyk saklaýar. Görmek - görkezmek derejesi. Bir tüýdük bilen tans etmegi we durmuş sikli bilen täsirleşmegi halamaýan bolsaňyz, işjeňlik , bölek ýa-da adaty görnüş bolar . Ilki bilen ähli Android programmalarynyň MVC gurluşyna tabyn bolandygyny ýatladýaryn , bu ýerde Dolandyryjy işjeňlik ýa- da bölek . Tanyşdyryjy , View we Model arasynda bir gatlak. View, bolup geçen wakalary geçirýär, alyp baryjy zerur bolsa olary işleýär, Modeliň içine girýär we görkezmek üçin maglumatlary View-a gaýtaryp berýär. “Android” we belli bir mysal bilen baglanyşykly möhüm bölegini - Şertnamany bellärin. Bu ýokardaky komponentleriň arasyndaky ähli täsirleri suratlandyrýan interfeýsdir. Nazary bölümi jemlemek üçin:
  • Görkeziji Tanyşdyryjy hakda bilýär;
  • Tanyşdyryjy View we Model (Ammar) hakda bilýär;
  • Öz-özünden nusga;
  • Şertnama olaryň arasyndaky täsirleri dolandyrýar.
Aslynda, mysalyň özi, synagyň ýönekeýligi üçin bir düwmä basyp, maglumatlar bazasyndan bir hatar ýükläris we ony TextView-de görkezeris . Mysal üçin, maglumatlar bazasynda şäherdäki iň oňat restoranlaryň sanawy bar. Şertnamadan başlalyň: Interfeýs döredeliň MainContract:
public interface MainContract {
    interface View {
        void showText();
    }

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

    interface Repository {
        String loadMessage();
    }
}
Häzirlikçe, geljekki programmamyzyň 3 bölegini we olaryň näme etjekdigini aýratyn belläp geçýäris. Indiki ammary suratlandyrarys:
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 "Сосисочная у Лёхи»;
    }
}
Maglumat ýüklemek we düşürmek bilen hemme zat düşnüklidir. Indiki görkeziji:
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()");
    }
}
Deprek we durmuş aýlawy bilen tans etmek hakda ýazanym ýadyňyzdamy? Tanyşdyryjy, “View” ömri uzak dowam edýär, çylşyrymly ulanyjy ssenarilerini işläp düzeniňizde, wagtyň nämedigine düşünmek üçin Tanyşdyryjydaky “View” jaňlarynyň hemmesini köpeltmegi we degişli pursatlarda jaň etmegi maslahat berýärin. häzirki wagtda “interleýerde” asylan maglumatlar bilen edilmeli. Netijede, Görüň:
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()");
    }
}
Näme bolýar?
  • “View” diýlip hem atlandyrylýan işjeňlik, “ onCreate()Presenter” mysalyny döredýär we özüni konstruktoryna geçirýär.
  • Tanyşdyryjy döredilende, Görnüşi aç-açan alýar we Ammar nusgasyny döredýär (aýtsak, Singleton edip bolýar)
  • Bir düwme basylanda, View alyp baryjyny kakýar we: "Düwme basyldy" diýýär.
  • Tanyşdyryjy ammara ýüzlenýär: "Maňa bu hapany göçürip al".
  • Ammar “zatlary” Tanyşdyryjyna ýükleýär we gowşurýar.
  • Tanyşdyryjy “View” -e ýüzlenýär: “Ine, size maglumat, çyzyň”
Ine, ýigitler. PS Komponentleriň arasyndaky jogapkärçiligi anyk kesgitlemek möhümdir. Mysal üçin, okuw taslamalarymyň birinde düwmä basanymda maglumatlar bazasyndaky maglumatlary üýtgetmek zerur boldy. Model POJO synpy tarapyndan beýan edildi, ekrandaky obýekt hakda maglumat üçin jogapkär bolan ýeriň ýerleşişi barada maglumat berdim, Tanyşdyryjy sanawda bu obýekti gözledi we ammaryna ýazmak üçin iberdi. Hemme zat mantykly ýaly görünýärmi? Myöne halypam aşakdakylary görkezdi: Ammar Diňe ýazmak we okamak bilen meşgullanmaly, POJO-dan zerur maglumatlary çykarmaly däl we näme ýazmalydygyny çözmeli däl. Tanyşdyryjy oňa diňe ýazga almak üçin maglumat bermeli we başga hiç zat ýok. Arhitekturany durmuşa geçirmek üçin berk çarçuwalar ýok: synag, synap görüň, özüňize amatly zady gözläň. Kody gözden geçirmekde uly ýoldaşlaryňyzy görkezmegi ýatdan çykarmaň =) Mysal GitHub-da bar: https://github.com/admitrevskiy/MVP_Example
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION