“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: Meniň 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.
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ň”
GO TO FULL VERSION