Desarrollo Android: MVI, ¿por qué puede simplemente ser más complicado?

se detalla

En estos días la abrumadora Nuggets MVI, pero lee son escritos por Mosby, me sentí tarifa a partir Mosby ella? PublishSubject sencilla se puede lograr, ejemplos de este artículo se cambia en el código anterior, el uso de Java, perdóname, la bienvenida aerosol Además, no rocíe incómoda Ha ...

concepto MVI

MVI es un concepto y MVVM aparecen juntos, la idea es seguir Rxjava las ideas sensibles derivadas de

MVVM supongo que todos estamos familiarizados, la transferencia de capa de datos LiveData -> persenter -> capa de interfaz de usuario y, a continuación para registrar el detector, éste es un proceso unidireccional, a partir de datos -> el proceso de interfaz de usuario:

General de MVVM Estamos todos tan escrito, pero algunas personas que escriben más a fondo, la interacción aplicación es un proceso bidireccional, a partir de la interfaz de usuario -> Datos y luego de datos -> interfaz de usuario, justo por encima de la forma común que lograr, por un lado, una más completa transformación sensible incluso se haga clic en eventos son sensibles, la capa de datos de eventos de clic de botón detector registrado para recibir datos a través de oleoductos Sheung Shui, el retorno de datos a distancia y luego devolver los datos a través de la tubería de alcantarillado:

En general no escribió una molestia -

MVI y bidireccional MVVM misma idea, la diferencia es MVI aún más la abstracción acción de interfaz de usuario, es decir, MVI en I - Intención, MVI en cualquiera de la interfaz de usuario de eventos son vistos como una fuente de datos sensibles, la tarea es unir la capa P V y M capa de registro relaciones, tal como calentador rechazaron la tubería de agua:

MVI en este Intención tienen sus propios pensamientos, cualquier cambio en la página de interfaz de usuario de la intención son en su conjunto, con un tipo de datos para representar, por ejemplo, hay objetos de un ViewState de carga en el interior, netError, el éxito representa los diferentes estado del pabellón de la página , devuelve la capa de datos en lugar de directamente ViewState de datos, capa de interfaz de usuario de la interfaz de usuario para mostrar diferentes patrones, de manera que una capa de pelo P hacer método de control de no escritura del estado de visualización de interfaz de usuario de acuerdo con el estado de ViewState, verdaderamente MVP el pensamiento jerárquico, a quién le importa que las cosas, por supuesto, pueden hacer MVVM, MVVM pero por lo general hay un retorno directo de datos, realmente poner el paquete en el estado de la página de datos también no mucha gente

class NetViewState(
        var loading: Boolean = false,
        var success: Boolean = false,
        var netError: Boolean = false,
        var dataError: Boolean = false,
        var dataNo: Boolean = false,
        var message: String = "",
        var data: BookResponse = BookResponse()) {

    companion object Help {

        @JvmStatic
        fun loading(): NetViewState {
            return NetViewState(loading = true)
        }

        @JvmStatic
        fun success(data: BookResponse): NetViewState {
            return NetViewState(success = true, data = data)
        }

        @JvmStatic
        fun netError(message: String): NetViewState {
            return NetViewState(netError = true, message = message)
        }

        @JvmStatic
        fun dataError(message: String): NetViewState {
            return NetViewState(dataError = true, message = message)
        }

        @JvmStatic
        fun dataNo(message: String): NetViewState {
            return NetViewState(dataNo = true,message = message)
        }
    }
}

El código para ir de

MVI He leído un montón de artículos, se logran por medio de Mosby esta biblioteca, Mosby traído un montón de tipo derivado, cada personaje tiene su clase base, prácticamente en gran medida el aumento de los costos de aprendizaje, MVI es esta idea MVVM que no espera que cada uno haga, pero bastante más compleja, no hay necesidad de terminar todo el bueno, sencillo, pero también es fácil de entender, fácil de leer

Uso rxjava emisión térmica o LiveData simplemente puede lograr MVI, y no quiero usar Mosby, fuera de su propia para lograr un MVI, siguiendo demo sólo demuestra una más introspectivo paquete por favor, optimización

capas Ui proporcionan eventos externos Intención

protected void onCreate(Bundle savedInstanceState) {
        btn_book.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bookIntent.onNext(new BookRequest("人生", "", "0", "10"));
            }
        });

        persenter.netActivity = this;
        persenter.bingIntent(bookIntent);
    }

    void updata(NetViewState netViewState) {

        if (netViewState.getLoading()) {
            Log.d("AA", "loading ...");
            return;
        }

        if (netViewState.getNetError()) {
            Log.d("AA", " netError:" + netViewState.getMessage());
        }

        if (netViewState.getDataError()) {
            Log.d("AA", " dataError:" + netViewState.getMessage());
        }

        if (netViewState.getSuccess()) {
            List<BookResponse.Book> books = netViewState.getData().getBooks();
            if (books != null && books.size() == 0) {
                ToastComponent.Companion.getInstance().show("没有数据", Toast.LENGTH_SHORT);
            }
            adapter.refreshData(books);
        }
    }

M atención nivel de evento aguas arriba de la capa de interfaz de usuario, se proporciona aguas abajo del visor de la capa de datos

public class BookRepositroy {

    public static final String URL_BOOK_LIST = "book/search";
    public PublishSubject<NetViewState> bookData = PublishSubject.create();

    public void bingIntent(Observable<BookRequest> bookIntent) {
        bookIntent.subscribe(new Consumer<BookRequest>() {
            @Override
            public void accept(BookRequest bookRequest) throws Exception {
                getBookData(bookRequest);
            }
        });
    }

    private void getBookData(BookRequest bookRequest) {

        Map<String, String> map = new HashMap<>();
        map.put("q", bookRequest.getTitle());
        map.put("tag", bookRequest.getTag());
        map.put("start", bookRequest.getStartCount());
        map.put("count", bookRequest.getWantCount());

        HttpClient.Companion.getInstance().get(URL_BOOK_LIST, map)
                .map(new Function<ResponseBody, NetViewState>() {
                    @Override
                    public NetViewState apply(ResponseBody responseBody) throws Exception {
                        BookResponse bookResponse = null;
                        try {
                            bookResponse = new Gson().fromJson(responseBody.string(), BookResponse.class);
                        } catch (Exception e) {
                            Observable.error(e);
                        }
                        return NetViewState.success(bookResponse);
                    }
                })
                .onErrorReturn(new Function<Throwable, NetViewState>() {
                    @Override
                    public NetViewState apply(Throwable throwable) throws Exception {

                        if (throwable instanceof HttpException) {
                            // HTTP错误
                            return NetViewState.netError("网络错误");
                        } else if (throwable instanceof ConnectException
                                || throwable instanceof UnknownHostException) {
                            // 连接错误
                            return NetViewState.netError("连接错误");
                        } else if (throwable instanceof InterruptedIOException) {
                            // 连接超时
                            return NetViewState.netError("连接超时");
                        } else if (throwable instanceof JsonParseException
                                || throwable instanceof JSONException
                                || throwable instanceof ParseException) {
                            return NetViewState.dataError("解析错误");
                        } else if (throwable instanceof ApiException) {
                            return NetViewState.netError(throwable.getMessage());
                        } else if (throwable instanceof IOException) {
                            return NetViewState.netError("网络错误");
                        }
                        return NetViewState.netError("位置错误");
                    }
                })
                .startWith(NetViewState.loading())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Consumer<NetViewState>() {
                    @Override
                    public void accept(final NetViewState netViewState) throws Exception {
                        bookData.onNext(netViewState);
                    }
                });
    }
}

aguas abajo relación Encuadernación capa p (V y P)

public class NetPersenter {

    public NetActivity netActivity;
    BookRepositroy repositroy = new BookRepositroy();

    public void bindBook(PublishSubject<BookRequest> bookIntent) {

        repositroy.bingIntent(bookIntent);
        repositroy.bookData.subscribe(new Consumer<NetViewState>() {
            @Override
            public void accept(NetViewState netViewState) throws Exception {
                netActivity.updata(netViewState);
            }
        });
    }
}

Pensando:

  • capa P sin registro de datos aguas abajo a la capa V, la capa de P en el interior debido a que podría tener la lógica de negocio a un acuerdo con primero, no directamente a la capa de U
  • M capa utilizando la prioridad startWith para enviar un evento de carga
  • ViewState aquí se puede optimizar aún más, la mayor parte del estado son la misma página, hay una necesidad de clase base abstracta, y el uso de koltin clase sellado (sellado) puede hacer mejor, decir ahora es la era de la Kotlin, Java pura he publicado el código no debe ser, esto se debe a que la página fue escrito antes de que el cambio anterior, o voy a la Kotlin

finalmente

No pocas líneas de código, que habrían estado no tiene la intención de escribir el artículo salió, pero luego pensar en las bibliotecas en línea se utilizan Mosby escrita MVI, escribo para ofrecerle otra idea de la misma, puede simplemente por qué es más complicado


En este también comparto un hermano mayor él incluido terminar la notas + Video + Entrevista + fuente documento de estudio de arquitectura Android PDF , así como la arquitectura técnica avanzada Brain Mapping, entrevista con Android desarrollo temático, mayor arquitectura de la información avanzada éstos son mi Boutique de ocio se repetirá datos leídos. En el mapa de la mente, cada punto está equipado con un conocimiento del tema correspondiente al proyecto real, puede ayudar eficazmente a captar los puntos de conocimiento.

En resumen también estamos aquí para ayudar a mejorar el aprendizaje avanzado, pero también le ahorra el tiempo para aprender los datos de búsqueda en línea también se pueden compartir con amigos cercanos estudiar juntos

Si usted tiene una necesidad, se puede señalar como comentario + , me preocupa , además Vx: 15388039515 (Nota CSDN, necesidad de datos más avanzado)

Publicados 200 artículos originales · ganado elogios 83 · Vistas a 70000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_45258969/article/details/104419790
Recomendado
Clasificación