جب میں نے ایک اینڈرائیڈ ڈویلپر کے طور پر اپنے سفر کا آغاز کیا تو "موبائل ایپلیکیشن آرکیٹیکچر" کے الفاظ نے مجھے گہری تشویش میں مبتلا کر دیا، گوگل اور Habré کے مضامین نے مجھے اور بھی زیادہ ڈپریشن میں ڈال دیا - میں کتاب کو دیکھتا ہوں اور کچھ بھی نظر نہیں آتا۔ میرا خیال ہے کہ اگر آپ یہ مضمون پڑھ رہے ہیں، تو آپ نے پہلے ہی اس تصویر کا ایک سے زیادہ بار مطالعہ کیا ہے اور یہ سمجھنے کی کوشش کی ہے کہ کیا ہو رہا ہے: موبائل کی ترقی میں تعمیراتی نقطہ نظر کو سمجھنے کا مسئلہ، میری رائے میں، فن تعمیر کی ہی تجرید میں مضمر ہے۔ ہر ڈویلپر کا اپنا وژن ہوتا ہے کہ اس یا اس پیٹرن کو صحیح طریقے سے کیسے نافذ کیا جائے۔ ایم وی پی کے نفاذ کی کم و بیش مہذب مثالیں انٹرنیٹ کے انگریزی بولنے والے شعبے میں پائی گئیں، جو کہ حیرت کی بات نہیں ہے۔ آئیے مختصراً دیکھتے ہیں کہ کیا ہے اور ایک مثال کی طرف بڑھتے ہیں۔ ماڈل - ڈیٹا کی سطح۔ میں "بزنس لاجک" کی اصطلاح استعمال کرنا پسند نہیں کرتا، اس لیے میں اپنی ایپلی کیشنز میں اسے Repository کہتا ہوں اور یہ ڈیٹا بیس اور نیٹ ورک کے ساتھ بات چیت کرتا ہے۔ دیکھیں - ڈسپلے کی سطح۔ اگر آپ کو دف کے ساتھ ناچنا اور زندگی کے چکر کے ساتھ تعامل کرنا پسند نہیں ہے تو یہ ایکٹیویٹی ، فریگمنٹ یا کسٹم ویو ہوگا ۔ میں آپ کو یاد دلاتا ہوں کہ ابتدائی طور پر تمام اینڈرائیڈ ایپلی کیشنز MVC ڈھانچے کے ماتحت ہیں ، جہاں کنٹرولر ایک سرگرمی یا ٹکڑا ہے ۔ پیش کنندہ منظر اور ماڈل کے درمیان ایک پرت ہے۔ ویو ان واقعات کو منتقل کرتا ہے جو اس میں پیش آتے ہیں، پیش کنندہ ان پر کارروائی کرتا ہے، اگر ضروری ہو تو، ماڈل تک رسائی حاصل کرتا ہے اور رینڈرنگ کے لیے ویو میں ڈیٹا واپس کرتا ہے۔ اینڈرائیڈ اور ایک مخصوص مثال کے سلسلے میں، میں اہم حصہ پر روشنی ڈالوں گا - معاہدہ۔ یہ وہ انٹرفیس ہے جو مندرجہ بالا اجزاء کے درمیان تمام تعاملات کو بیان کرتا ہے۔ نظریاتی حصے کا خلاصہ کرنے کے لیے:
- View Presenter کے بارے میں جانتا ہے۔
- پیش کنندہ دیکھیں اور ماڈل (ذخیرہ) کے بارے میں جانتا ہے؛
- خود ہی ماڈل؛
- معاہدہ ان کے درمیان تعاملات کو کنٹرول کرتا ہے۔
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()");
}
}
کیا آپ کو یاد ہے کہ میں نے دف کے ساتھ رقص اور زندگی کے چکر کے بارے میں لکھا تھا؟ پیش کنندہ اس وقت تک زندہ رہتا ہے جب تک اس کا ویو زندہ رہتا ہے، جب صارف کے پیچیدہ منظرنامے تیار کرتے ہیں، میں آپ کو مشورہ دیتا ہوں کہ پیش کنندہ میں موجود تمام ویو کال بیکس کو ڈپلیکیٹ کریں اور انہیں مناسب لمحات پر کال کریں، ایکٹیویٹی/فراگمنٹ لائف سائیکل کو ڈپلیکیٹ کرتے ہوئے، وقت پر سمجھنے کے لیے اس ڈیٹا کے ساتھ کرنے کی ضرورت ہے جو فی الحال "انٹرلیئر" میں لٹکا ہوا ہے۔ اور آخر میں، دیکھیں:
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()
ایک طریقہ کار میں ایک پیش کنندہ مثال تخلیق کرتا ہے اور خود کو اس کے کنسٹرکٹر تک پہنچاتا ہے۔ - جب ایک پیش کنندہ بنایا جاتا ہے، تو یہ واضح طور پر ایک ویو حاصل کرتا ہے اور ایک ریپوزٹری مثال بناتا ہے (ویسے، اسے سنگلٹن بنایا جا سکتا ہے)
- جب ایک بٹن دبایا جاتا ہے، تو منظر پیش کنندہ پر دستک دیتا ہے اور کہتا ہے: "بٹن دبایا گیا تھا۔"
- پیش کنندہ ریپوزٹری کا رخ کرتا ہے: "میرے لئے یہ گھٹیا ڈاؤن لوڈ کریں۔"
- ریپوزٹری لوڈ کرتی ہے اور پیش کنندہ کو "سامان" فراہم کرتی ہے۔
- پیش کنندہ منظر کی طرف مڑتا ہے: "یہ رہا آپ کے لیے ڈیٹا، اسے کھینچیں"
GO TO FULL VERSION