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)