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: Masalah 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.
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"
GO TO FULL VERSION