Implementar Ice en Android Studio y crear una aplicación sencilla - ASTROINGENIERIA/ASTROUFRO GitHub Wiki

Requisitos

  • Software Ice instalado
  • Nuevo proyecto en android studio (basic activity)
  • Api mayor o igual a 24 (android 7.0 o mayor)

Configurar Gradle

Dirigirse a File->Project Structure. Una vez dentro dirigirse a app ubicada en Modules y luego en Dependencies, clic en add->Library dependency, y buscar "com.zeroc:ice:3.7.1-1".

Crear archivo slice y generar las stubs

Añadir un nuevo package (dentro del directorio java) y nombrarlo como "slice". Le añadimos un nuevo File y escribimos lo siguiente:

// Printer.ice
module Demo
{
    interface Printer
    {
        // A client can invoke this operation on a server.
        // In this example we print the string s
        void printString(string s);
    }
}

Luego, generamos los archivos con el comando slice2java. Para esto, hacer clic derecho sobre el archivo, y después en Open in terminal y escribir el comando.

Modificar clase MainActivity

Para empezar, creamos un nuevo boton que nos servirá para ejecutar un "Hola Mundo" cada vez que se le haga clic. Luego, agregamos la función que nos permitirá ejecutar un "Hola Mundo" en el servidor (Ingrese el n° ip del servidor donde se indica). Para ésto último, creamos una subclase (dentro de MainActivity) que herede de AsyncTask (muy importante!). Finalmente nos debería quedar algo parecido a lo siguiente:

//Clase MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn=findViewById(R.id.id_btn);
        btn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        if (v.getId()==R.id.id_btn){
            InternetAsyncTask iat=new InternetAsyncTask();
            iat.execute();
        }
    }

    class InternetAsyncTask extends AsyncTask<Void,Void,Void>{

        @Override
        protected Void doInBackground(Void... voids) {
            try (Communicator communicator = Util.initialize()) {
                ObjectPrx base = communicator.stringToProxy("SimplePrinter:default -h IngreseIPServidorAqui -p 10000"); //Consulte el numero ip del servidor
                PrinterPrx printer = PrinterPrx.checkedCast(base);
                if (printer == null) {
                    throw new Error("Invalid proxy");
                }
                printer.printString("Hello World");
            }
            return null;
        }
    }
}

Para implementar el botón dentro del diseño de vista, nos debemos dirigir a java->res->layout->activity_main.xml y modificar TextLayout por Button y agregarle un id, quedando algo parecido a esto:

//Layout activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/id_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

Finalmente, le damos permisos de Internet a la aplicación en manifests->AndroidManifest.xml. Para esto, añadimos los siguiente:

<uses-permission android:name="android.permission.INTERNET"/>

Ejecutar la app

Arranque el servidor y ejecute la aplicación con un emulador o dispositivo con versión de android mayor o igual a 7.0