LINUX.ORG.RU
ФорумMobile

Android, MVC и AsyncTask, который его ломает.

 , , ,


0

1

Ночи доброй ЛОР. Подпекло у меня тут от одной темы, нужно мнение тру ъ, которые в этом понимают.
Я всегда старался придерживаться принципа Model - View - Controller при разработке приложений под ведро. Для тех, кто не в теме: Это деление кода на 3 логические группы, где
Model - Данные, и все что с ними связано (Что отображать).
View - как отображать (в контексте Android это xml файл с разметкой)
Controller - это прослойка между 2мя этими вещами, по сути выдергивает данные из модели и обновляет UI. Простой пример кода для наглядности

private TextView mTv1, mTv2;
private MyModelData mModel = new Model;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTv1 = (TextView) findViewById(R.id.myTv1);
        mTv2 = (TextView) findViewById(R.id.myTv2);

        mTv1.setText(mModel.getData1);
        mTv2.setText(mModel.getData2);
    }

То есть, ключевое правило здесь - Модель никогда не взаомодействует с View, а Controller (в нашем случае это код активити) никогда не занимается данными.
И все бы ничего, да подгорело у меня от «Best Practices» на офф сайте гугл девелоперов. Раньше я использовал OkHttp либу для работы с сетью в отдельном потоке, все было ок, но сейчас решил попробовать дефолтный AsyncTask из SDK, и ... бл*ять, они работают с сетью и моделью в ... контроллере? Какого черта, ЛОРовцы, это норма или говнокод? И у меня рождается вопрос: А есть ли вообще MVC в ведре? Дискасс.

★★★★

AsyncTask с моделью и сетью сам по себе не работает. Может в примерах где-то так делают, но на то они и примеры, чтобы минимальным кол-вом строк кода показать как оно работает, а не соблюдать best practices.

kazufukurou
()
Ответ на: комментарий от kazufukurou

То есть класс с AsyncTask'ом делать не как inner для контроллера, а как отдельный? Тогда получается один костыльвыход: В этом классе делать CallBack и в onPostExecute() у Async его тригеррить, хз костыли это или норма + придется передавать Context скорее всего, что, имхо, не очень хорошо.

Jefail ★★★★
() автор топика

А есть ли вообще MVC в ведре?

Скоро там будет MVVM, пока он в RC, но уже экономит мне кучу времени и нервов.

И все бы ничего, да подгорело у меня от «Best Practices»

У меня тоже постоянно подгорало, пока я не открыл для себя такие вещи как retrofit, eventbus, data binder и universalimageloader.

они работают с сетью и моделью в ... контроллере?

Вот такие вот best practices.

anonymous
()
Ответ на: комментарий от anonymous

Кстати, знаю что MVVM из коробки идет в WP, но только слышал о нем, на практике использовать не доводилось, если в кратце: какие профиты?

Jefail ★★★★
() автор топика
Ответ на: комментарий от Jefail

Активность не подходит на роль контроллера, если ей надо с сетью работать, пока запрос пройдет она может 10 раз пересоздаться при повороте экрана. Я бы рассматривал активность как View, сделал бы ее Observer'ом, а контроллер Observable, и подписывал отписывал на onResume-onPause. AsyncTask в такой схеме не дает преимуществ. Он скорее для мелких задач не дольше пары секунд, чтобы ANR не возник.

kazufukurou
()
Ответ на: комментарий от anonymous

Было подобие биндинга и раньше, типа onClick() можно было прям в лайауте прописать. Но рушилось proguard'ом. Интересно как новые биндинги с ним дружат.

kazufukurou
()

Про анти-паттерны слышал когда-нибудь, спец?

crutch_master ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.