JavaRush /Blog Jawa /Random-JV /MVP ing Android kanggo bocah cilik

MVP ing Android kanggo bocah cilik

Diterbitake ing grup
Nalika miwiti perjalanan minangka pangembang Android, tembung "Arsitektur Aplikasi Seluler" nyebabake aku bingung, Google lan artikel babagan Habré nyebabake depresi sing luwih gedhe - Aku ndeleng buku kasebut lan ora weruh apa-apa. Aku mikir yen sampeyan maca artikel iki, sampeyan wis nyinaoni gambar iki luwih saka sepisan lan nyoba kanggo mangerteni apa sing kedadeyan: MVP ing Android kanggo bocah cilik - 1Masalah kanggo mangerteni pendekatan arsitektur ing pangembangan seluler, miturut pendapatku, dumunung ing abstraksi arsitektur kasebut dhewe. Saben pangembang duwe visi dhewe babagan carane ngetrapake pola iki utawa kasebut kanthi bener. Conto liyane utawa kurang prayoga saka implementasine MVP ditemokaké ing sektor Inggris-speaking Internet, kang ora ngageti. Ayo katon sedhela apa apa lan pindhah menyang conto. Model - tingkat data. Aku ora seneng nggunakake istilah "logika bisnis", supaya ing aplikasi aku nyebat Repository lan komunikasi karo database lan jaringan. Tampilan - tingkat tampilan. Iku bakal Aktivitas , Fragmen utawa Custom View yen sampeyan ora seneng nari karo rebana lan sesambungan karo siklus urip. Ayo kula ngelingake sampeyan sing wiwitane kabeh aplikasi Android subordinated kanggo struktur MVC , ngendi Controller iku sawijining Kegiatan utawa Fragmen . Presenter minangka lapisan antarane Tampilan lan Model. View ngirim acara sing kedadeyan, presenter ngolah, yen perlu, ngakses Model lan bali data menyang View kanggo rendering. Ing hubungan kanggo Android lan conto tartamtu, aku bakal nyorot bagean penting - Kontrak. Iki minangka antarmuka sing nggambarake kabeh interaksi antarane komponen ing ndhuwur. Kanggo ngringkes bagean teoretis:
  • Ndeleng ngerti babagan Presenter;
  • Presenter ngerti babagan Tampilan lan Model (Repositori);
  • Model dhewe;
  • Kontrak ngatur interaksi ing antarane.
Bener, contone dhewe, kanggo kesederhanaan eksperimen, kanthi ngeklik tombol, kita bakal mbukak baris saka database lan nampilake ing TextView . Contone, database ngemot dhaptar restoran paling apik ing kutha. Ayo miwiti karo kontrak: Ayo nggawe antarmuka MainContract:
public interface MainContract {
    interface View {
        void showText();
    }

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

    interface Repository {
        String loadMessage();
    }
}
Saiki, kita mung nyorot 3 komponen aplikasi mbesuk lan apa sing bakal ditindakake. Sabanjure kita bakal njlèntrèhaké Repositori:
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 "Сосисочная у Лёхи»;
    }
}
Kabeh wis jelas, mung mbukak lan mbongkar data. Sabanjure yaiku Presenter:
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()");
    }
}
Apa sampeyan kelingan yen aku nulis babagan nari nganggo rebana lan siklus urip? Presenter urip anggere View sawijining urip, nalika ngembangaken skenario pangguna Komplek, aku maringi pitutur sampeyan kanggo duplikat kabeh View callbacks ing Presenter lan nelpon ing wektu sing cocok, duplikasi siklus urip Activity / Fragmen, supaya ngerti ing wektu apa perlu. kanggo rampung karo data sing nggandhol saiki ing "interlayer". Lan pungkasanipun, Ndeleng:
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()");
    }
}
Ana apa?
  • Aktivitas, uga dikenal minangka View, onCreate()nggawe conto Presenter ing sawijining metode lan ngliwati konstruktor kasebut.
  • Nalika Presenter digawe, kanthi jelas nampa Tampilan lan nggawe conto Repositori (kanthi cara, bisa digawe Singleton)
  • Nalika tombol ditekan, Tampilan nutul presenter lan ujar: "Tombol dipencet."
  • Presenter dadi Repository: "Unduh omong kosong iki kanggo aku."
  • Repositori ngemot lan ngirim "barang" menyang Presenter.
  • Presenter dadi Deleng: "Iki data kanggo sampeyan, tarik"
Mekaten, cah. PS Penting kanggo jelas delineate tanggung jawab antarane komponen. Contone, ing salah sawijining proyek latihan, nalika ngeklik tombol, sampeyan kudu ngganti data ing database. Model iki diterangake dening kelas POJO, Aku liwati informasi bab lokasi tampilan, kang tanggung jawab kanggo informasi bab obyek ing layar, Presenter katon kanggo obyek iki ing dhaftar lan dikirim kanggo ditulis kanggo Repository. Apa kabeh katon logis? Nanging mentorku nuding ing ngisor iki: Repositori mung kudu nulis lan maca, ora kudu narik informasi sing dibutuhake saka POJO lan mutusake apa sing kudu ditulis. Presenter kudu menehi informasi mung kanggo direkam lan ora liya. Ora ana kerangka sing ketat kanggo ngleksanakake arsitektur: eksperimen, coba, goleki sing trep kanggo sampeyan kanthi pribadi. Lan aja lali nuduhake kanca senior babagan review kode =) Conto kasedhiya ing GitHub: https://github.com/admitrevskiy/MVP_Example
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION