JavaRush /جاوا بلاگ /Random-SD /ننڍڙن لاءِ Android ۾ MVP

ننڍڙن لاءِ Android ۾ MVP

گروپ ۾ شايع ٿيل
جڏهن مون پنهنجو سفر هڪ اينڊرائيڊ ڊولپر جي حيثيت سان شروع ڪيو، ته لفظ ”موبائيل ايپليڪيشن آرڪيٽيڪچر“ مون کي تمام گهڻي حيرانگي جو سبب بڻيا، گوگل ۽ هيبري تي آرٽيڪلز مون کي اڃا به وڌيڪ ڊپريشن ۾ آڻي ڇڏيو- مان ڪتاب کي ڏسان ٿو ۽ ڪجهه به نه ٿو ڏسان. منهنجو خيال آهي ته جيڪڏهن توهان هن مضمون کي پڙهي رهيا آهيو، توهان اڳ ۾ ئي هن تصوير کي هڪ ڀيرو کان وڌيڪ اڀياس ڪيو آهي ۽ سمجهڻ جي ڪوشش ڪئي آهي ته ڇا ٿي رهيو آهي: ننڍڙن لاءِ Android ۾ MVP - 1موبائل ترقي ۾ تعميراتي نقطه نظر کي سمجهڻ جو مسئلو، منهنجي خيال ۾، خود فن تعمير جي خلاصن ۾ آهي. هر ڊولپر جو پنهنجو نظريو آهي ته هن يا انهي نموني کي صحيح طريقي سان ڪيئن لاڳو ڪجي. MVP لاڳو ڪرڻ جا وڌيڪ يا گهٽ مهذب مثال انٽرنيٽ جي انگريزي-ڳالهائيندڙ شعبي ۾ مليا ويا، جيڪا تعجب جي ڳالهه ناهي. اچو ته مختصر طور تي ڏسو ته ڇا آهي ۽ هڪ مثال ڏانهن وڃو. ماڊل - ڊيٽا جي سطح. مان "ڪاروباري منطق" اصطلاح استعمال ڪرڻ پسند نٿو ڪريان، تنهنڪري منهنجي ايپليڪيشنن ۾ آئون ان کي Repository سڏيندو آهيان ۽ اهو ڊيٽابيس ۽ نيٽ ورڪ سان رابطو ڪري ٿو. ڏسو - ڊسپلي سطح. اها سرگرمي ، ٽڪرا يا حسب ضرورت هوندي جيڪڏهن توهان ٽمبرين سان ناچ ڪرڻ ۽ زندگي جي چڪر سان لهه وچڙ ڪرڻ پسند نٿا ڪريو. مان توهان کي ياد ڏياران ٿو ته شروعات ۾ سڀئي Android ايپليڪيشنون MVC ساخت جي ماتحت آهن ، جتي ڪنٽرولر هڪ سرگرمي يا ٽڪرا آهي . پيش ڪندڙ ڏيک ۽ ماڊل جي وچ ۾ هڪ پرت آهي. View انهن واقعن کي منتقل ڪري ٿو جيڪي ان ۾ واقع ٿين ٿا، پيش ڪندڙ انهن کي پروسيس ڪري ٿو، جيڪڏهن ضروري هجي ته، ماڊل تائين رسائي حاصل ڪري ۽ ڊيٽا کي ڏيک لاءِ ڏيک ڏانهن موٽائي. Android ۽ هڪ مخصوص مثال جي حوالي سان، مان اهم حصو کي اجاگر ڪندس - معاهدو. اهو انٽرفيس آهي جيڪو بيان ڪري ٿو مٿين حصن جي وچ ۾ سڀني ڳالهين کي. نظرياتي حصو اختصار ڪرڻ لاء:
  • View knows about Presenter;
  • پيش ڪندڙ کي ڏسڻ ۽ ماڊل (مخزن) بابت ڄاڻ آهي؛
  • پاڻ ماڊل؛
  • معاهدو انهن جي وچ ۾ رابطي کي سنڀاليندو آهي.
دراصل، مثال پاڻ، تجربي جي سادگي لاءِ، هڪ بٽڻ تي ڪلڪ ڪرڻ سان، اسان ڊيٽابيس مان هڪ قطار لوڊ ڪنداسين ۽ ان کي TextView ۾ ڏيکارينداسين . مثال طور، ڊيٽابيس ۾ شهر جي بهترين ريسٽورنٽ جي فهرست شامل آهي. اچو ته معاهدي سان شروع ڪريون: اچو ته هڪ انٽرفيس ٺاهيون MainContract:
public interface MainContract {
    interface View {
        void showText();
    }

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

    interface Repository {
        String loadMessage();
    }
}
هينئر لاءِ، اسان صرف نمايان ڪري رهيا آهيون 3 جزا اسان جي مستقبل جي ايپليڪيشن جا ۽ اهي ڇا ڪندا. اڳيون اسين بيان ڪنداسين Repository:
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()");
    }
}
ڇا توهان کي ياد آهي ته مون ٽمبرين سان ناچ ۽ زندگي جي چڪر بابت لکيو هو؟ پريزينٽر جيئرو رهندو آهي جيستائين ان جو View زندگي گذاريندو آهي، جڏهن پيچيده استعمال ڪندڙ منظرنامي کي ترقي ڪندي، مان توهان کي صلاح ڏيان ٿو ته پيش ڪندڙ ۾ موجود سڀئي ڪال بڪ کي نقل ڪريو ۽ انهن کي مناسب لمحن تي ڪال ڪريو، سرگرمي/فراگمينٽ لائف سائيڪل کي نقل ڪري، وقت ۾ سمجهڻ لاءِ. انهي ڊيٽا سان ٿيڻ جي ضرورت آهي جيڪا هن وقت ”انٽرليئر“ ۾ لٽڪيل آهي. ۽ آخرڪار، ڏسو:
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()");
    }
}
ڇا ٿي رهيو آهي؟
  • سرگرمي، جنهن کي View جي نالي سان پڻ سڃاتو وڃي ٿو، onCreate()هڪ طريقي سان پيش ڪندڙ مثال ٺاهي ٿو ۽ پاڻ کي ان جي تعمير ڪندڙ ڏانهن منتقل ڪري ٿو.
  • جڏهن هڪ پيش ڪندڙ ٺاهيو ويندو آهي، اهو واضح طور تي هڪ ڏيک حاصل ڪري ٿو ۽ هڪ ريپوزٽري مثال ٺاهي ٿو (انهي سان، اهو هڪ سنگلٽن ٺاهي سگهجي ٿو)
  • جڏهن هڪ بٽڻ دٻايو ويندو آهي، ڏسو پيش ڪندڙ تي ڇڪيندو آهي ۽ چوي ٿو: "بٽڻ کي دٻايو ويو."
  • پيش ڪندڙ مخزن ڏانهن رخ ڪري ٿو: "مون کي هي گندو ڊائون لوڊ ڪريو."
  • مخزن لوڊ ڪري ٿو ۽ "سامان" پيش ڪندڙ کي پهچائي ٿو.
  • پيش ڪندڙ ڏيکاءُ ڏانهن موڙي ٿو: ”هتي آهي ڊيٽا توهان لاءِ، ان کي ڪڍو“
اهو آهي، دوستو. PS اهو ضروري آهي ته واضح طور تي اجزاء جي وچ ۾ ذميواريون بيان ڪن. مثال طور، منهنجي تربيتي منصوبن مان هڪ ۾، جڏهن هڪ بٽڻ تي ڪلڪ ڪيو، ڊيٽابيس ۾ ڊيٽا کي تبديل ڪرڻ ضروري هو. ماڊل هڪ POJO ڪلاس پاران بيان ڪيو ويو آهي، مون ڏيک جي مقام بابت معلومات منظور ڪئي، جيڪا اسڪرين تي اعتراض بابت معلومات لاء ذميوار آهي، پيش ڪندڙ لسٽ ۾ هن اعتراض کي ڳوليائين ۽ ان کي مخزن ڏانهن لکڻ لاء موڪليو. ڇا سڀ ڪجهه منطقي لڳي ٿو؟ پر منهنجي مرشد هيٺ ڏنل اشارو ڪيو: مخزن کي صرف لکڻ ۽ پڙهڻ گهرجي، اهو ضروري معلومات کي POJO کان ٻاهر نه ڪڍڻ گهرجي ۽ فيصلو ڪرڻ گهرجي ته ان کي ڇا لکڻ جي ضرورت آهي. پيش ڪندڙ کي لازمي طور تي کيس صرف رڪارڊ ڪرڻ جي معلومات ڏيڻ گهرجي ۽ وڌيڪ ڪجهه به نه. فن تعمير کي لاڳو ڪرڻ لاء ڪو به سخت فريم ورڪ ناهي: تجربو، ڪوشش ڪريو، ڏسو ته ڇا توهان لاء ذاتي طور تي آسان آهي. ۽ پنهنجي سينيئر ڪامريڊن کي ڏيکارڻ نه وساريو ڪوڊ جي نظرثاني =) مثال موجود آهي GitHub تي: https://github.com/admitrevskiy/MVP_Example
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION