¿Recuerdas? En esos años nos encontramos con (Fidl: aleteo comunidad AIDL)

prefacio

Hola a todos! Hoy en día, creo que Amway una relativamente pesado aleteo de proyectos de código abierto.

definición del producto aleteo es un marco de interfaz de usuario móvil multiplataforma de alto rendimiento, puede construirse con un conjunto de código de tiempo / aplicaciones Android / iOS / Web MacOS. Como marco de interfaz de usuario , que no tiene algunas de las interfaces del sistema, no pueden dejar de enfrentar natural o nativa. Desde entonces, se presenta algo llamado canal de plataforma para el intercambio de datos flexibles y nativos aleteo. Para facilitar la descripción, se refiere a un nativo generaciones Android.

¿Recuerdas?  En esos años nos encontramos con (Fidl: aleteo comunidad AIDL)

La quema de ganso, ganso de combustible, ganso de combustible , que sólo es compatible con la transmisión de algunos de los tipos de datos básicos y estructuras de datos, por ejemplo bool / int / long / byte / char / Cadena / byte [] / Lista / Mapa similares.

Por lo tanto, cuando se desea transferir los puntos de datos complejos, sólo se puede envasados ​​mapa, así:

await _channel.invokeMethod('initUser',
    {'name': 'Oscar', 'age': 16, 'gender': 'MALE', 'country': 'China'});

A continuación, la capa de Android de código duro, analiza diferentes datos correspondientes a la tecla. Si usted va a un proyecto Acanaladora pura, y más tarde no hay acuerdo y el nativo, o simplemente necesita una interacción sencilla, que este enfoque es comprensible. Y cuando el proyecto ha sido una gran parte del código nativo, o cuando es necesario utilizar un tercero no soporta el aleteo de la biblioteca lib, esto significa que usted necesita para escribir un montón de código como una plantilla para arriba. Visible ineficiente, y facilidad de mantenimiento. En este punto, tendrá que ser capaz de objetos de transferencia como!

Y cuando se quiere objetos de transferencia:

¿Recuerdas?  En esos años nos encontramos con (Fidl: aleteo comunidad AIDL)

Lo sentimos, no hay manera, sólo le puede dar una crisis embarazosa no son educada sonrisa. Por supuesto, ni no es, podemos secuencia diana en el JSON objeto primario superior, JSON y luego se convierten en la capa de objetos en el aleteo aleteo, la misma eficiencia es pobre.

Lo que es Fidl

Android aprendió debe saber AIDL (Android Interfaz Defination Language), es decir, la interfaz de Android lenguaje de definición. Android existe un alto nivel de comunicación entre procesos --Binder, pero desea utilizar Carpeta necesidad de comprender algunos de los mecanismos y API Binder, tiene que escribir una gran cantidad de código repetitivo. Android Para resolver este problema, trate de usar manera carpeta blanca para hacerlo. Así definido AIDL, dice el desarrollador, debe presentar una interfaz de escritura de acuerdo a mis necesidades, hay que cruzar el objeto debe implementar el proceso de transferencia de la interfaz parcelable. Entonces, Android da a generar una clase Service.Stub, en secreto detrás de la serialización de objetos, deserialización dio trabajo por hacer. Los desarrolladores que utilizan esta clase podrán Carpeta del trozo fácilmente empezar Este método de comunicación entre procesos de alto nivel. (Hice, hey)

Fidl (intermitencia interfaz Defination Language) lenguaje de definición de interfaz que es aleteo, su misión y AIDL muy similar, en silencio serialización de objetos, deserialización, generación automática de código como "trabajo sucio" a hacer. Desarrollador visto en la clase de código nativo, por etiqueta @FIDL anotación, generando automáticamente el mismo lado del dardo y la clase de código nativo. Fidl es un espejo, las diversas clases asignadas a la plataforma nativa dardo en las clases asignadas a Dardo respectiva Internet nativa.

Menos de largo aliento, mirada a las cosas

¿Recuerdas?  En esos años nos encontramos con (Fidl: aleteo comunidad AIDL)

La primera es la clase de Java:

public class User {
  String name;
  int age;
  String country;
  Gender gender;
}
enum Gender {
  MALE, FEMALE
}

lado Android

1, la interfaz se define Fidl

public class User {
  String name;
  int age;
  String country;
  Gender gender;
}
enum Gender {
  MALE, FEMALE
}

2, ejecute ./gradlew assembleDebug, archivos y fidl.json clase de generación IUserServiceStub

3, para abrir el canal, el método descrito Flutter

FidlChannel.openChannel(getFlutterEngine().getDartExecutor(), new IUserServiceStub() {
  @Override
  void initUser(User user){
    System.out.println(user.name + " is " + user.age + "years old!");
  }
}

lado aleteo

1, el archivo para copiar el directorio fidl.json fidl, Ejecutar paquetes aleteo pub plazo fidl_model, clase de interfaz genera dardo

2, Android lado de unión IUserServiceStub pasaje

await Fidl.bindChannel(IUserService.CHANNEL_NAME, _channelConnection);

3, llame al método público

await IUserService.initUser(User());

Compilar y ejecutar, usted será capaz de ver en la Logcat Oscar tiene 18 años!.

Fidl usos detallados

Esta parte es un poco más largo aliento, mirada a lo que parte de las explicaciones adicionales, el público puede poseer abuelo omitido.

En el ejemplo anterior de la Hoja, en general, estará en Java corresponde a una clase:

public class User {
  String name;
  int age;
  String country;
  Gender gender;
}
enum Gender {
  MALE, FEMALE
}

Si desea que la transmisión aleteo de este objeto sin la capa de aleteo a la clase de usuario de escritura manual y método write fromJson / toJson, usted puede hacer esto:

lado Android

1, definen una interfaz, añadir anotaciones @FIDL. Esta anotación informará a las interfaces annotationProcessor y generar algún tipo de archivos de descripción.

@FIDL
public interface IUserService {
  void initUser(User user);
}

método de interfaz de restricción como sigue:

  • Desde el dardo no soporta la sobrecarga de métodos, por lo que el mismo nombre no puede aparecer en el método de interfaz
  • El parámetro sólo es compatible con las clases de entidad, no son compatibles con las devoluciones de llamada
  • Debido a las limitaciones de decodificación JSON, Java requiere constructor sin argumentos

2, Android Studio clic sincronización, o ejecutar:

./gradlew assembleDebug

A continuación, tendrá un montón de archivo JSON de la siguiente manera:

¿Recuerdas?  En esos años nos encontramos con (Fidl: aleteo comunidad AIDL)

Estos archivos JSON es el archivo de descripción Fidl y clases. Sí, también generará Género usuario perfil de la clase referenciada .

Al mismo tiempo, también genera IUserService IUserServiceStub aplicación. A saber:

  • com.infiniteloop.fidl_example.IUserService.fidl.json
  • com.infiniteloop.fidl_example.User.json
  • com.infiniteloop.fidl_example.Gender.json
  • com.infiniteloop.fidl_example.IUserServiceStub.java

Limitaciones: sólo generan una fuerte relación entre el archivo de referencia Fidl, las interfaces subclase Fidl fuerte de clase que se hace referencia si la interfaz no es Fidl referencia fuerte, no se genera el perfil correspondiente.

3, el canal se abre en el lugar correcto, el método descrito Flutter

IUserServiceStub userService = new IUserServiceStub() {
  @Override
  void initUser(User user){
    System.out.println(user.name + " is " + user.age + "years old!");
  }
FidlChannel.openChannel(getFlutterEngine().getDartExecutor(), userService);

4, si es necesario, el canal se puede cerrar en su caso

FidlChannel.closeChannel(userService);

Cerca del lado mensaje de notificación trémolo.

lado aleteo

1, el aleteo en sus proyectos, crear el directorio fidl en el directorio lib, copie el archivo JSON anterior a este directorio y ejecutar:

flutter packages pub run fidl_model

A continuación, se puede generar automáticamente basándose en el directorio de dardos fidl:

¿Recuerdas?  En esos años nos encontramos con (Fidl: aleteo comunidad AIDL)

A saber:

  • User.dart
  • Gender.dart
  • IUserService.dart

2, Android lado de unión IUserServiceStub pasaje

bool connected = await Fidl.bindChannel(IUserService.CHANNEL_NAME, _channelConnection);

_channelConnection conexión de canal de seguimiento del estado de IUserService, cuando la conexión de canal tiene éxito, será devolución de llamada método onConnected; cuando se desconecta el canal, lo hará onDisconnected devolución de llamada de método.

3, se describe un método de canales de llamada

if (_channelConnection.connected) {
  await IUserService.initUser(User());
}

</>

4. Si ya no necesita utilizar este canal, puede desenlazar

await Fidl.unbindChannel(IUserService.CHANNEL_NAME, _channelConnection);

Por supuesto, Fidl función más que eso

1, una pluralidad de parámetros de la interfaz de Fidl

void init(String name, Integer age, Gender gender, Conversation conversation);

2, con un valor de retorno de la interfaz Fidl

UserInfo getUserInfo();

3, apoyar la generación de clase genérica

public class User<T> {
  T country;
}
public class AUser<String>{}

Fidl Interfaz:

void initUser(AUser user);

El usuario será capaz de generar y AUSER clases de dardos lado, la herencia puede mantener.

4, la transferencia de enumeración

void initEnum0(EmptyEnum e);
String initEnum1(MessageStatus status);

5, que pasa a la colección, mapa

void initList0(List<String> ids);
void initList1(Collection<String> ids);
void initList7(Stack<String> ids);
void initList10(BlockingQueue ids);

6, transferir objetos complejos. Herencia, abstractos, genéricos, enumeraciones, y las clases mixtas a una docena a.

Ahora, Fidl proyecto sólo para darse cuenta de la llamada al método desde el lado androide del lado Dart. Hay trabajo que hacer lo siguiente:

  • Método de lado a lado androide llama dardo
  • Llamar a los demás plataformas y métodos del alboroto
  • EventChannel, la EventChannel esencialmente lograrse MethodChannel, no hay problema

Obtener la transmisión objeto, estos problemas son pequeños amigos de casos.

Para la serialización y deserialización de los objetos

Con el fin de cumplir con los peces gordos de los requisitos de personalización que tengo en el lado de Java y el lado del alboroto define la serialización / de-serialización de la clase de interfaz.

Java:
public interface ObjectCodec {
    List<byte[]> encode(Object... objects);
    <T> T decode(byte[] input, TypeLiteral<T> type);
}
Dart:
abstract class ObjectCodec {
  dynamic decode(Uint8List input);
  List<Uint8List> encode(List objects);
}

Actualmente el uso de JsonObjectCodec, a través de JSON de codificación y decodificación, el rendimiento será algo menor. Trasera y socios pequeños también quieren trabajar juntos para lograr un códec más eficiente.

Calendario del proyecto

Las funciones antes mencionadas, siempre que el método se invoca desde el lado de Java del lado asociado Flutter, la mayor parte se han conseguido.

Hice una demostración, se basa en un lado Android simulado del SDK de IM (mensajería instantánea), chatear aleteo necesidad lado para obtener el mensaje, un mensaje de la escena. La siguiente es una captura de pantalla de demostración:

1, la página de inicio, haga clic en el botón llama al método lado Android, abre el servicio de chat

¿Recuerdas?  En esos años nos encontramos con (Fidl: aleteo comunidad AIDL)

2, página de chat

¿Recuerdas?  En esos años nos encontramos con (Fidl: aleteo comunidad AIDL)

3, para enviar un mensaje y adquiere y chats Lucy Lucy

¿Recuerdas?  En esos años nos encontramos con (Fidl: aleteo comunidad AIDL)

4, un método de transmisión de mensajes secundarios llamando Android N Wilson para charlar y adquiere

¿Recuerdas?  En esos años nos encontramos con (Fidl: aleteo comunidad AIDL)

El artículo no es fácil, si te gusto este artículo, o si tiene una gran cantidad de esperanza que nos ayuda, pulgar hacia arriba, hacia adelante, la preocupación  oh. Los artículos serán actualizados continuamente. Absolutamente seco! ! !

Supongo que te gusta

Origin blog.51cto.com/14775360/2485685
Recomendado
Clasificación