Uso de Callbacks

Oct 12, 2017
Uso de Callbacks
  • Primero veremos.
    1.1 ¿Qué es un Callback? Los callbacks, son conocidas como "llamadas de vuelta", con un valor especifico añadido, el cual se puede ejecutar y obtener este mismo valor


    Aquí te enseñaremos como obtener un valor especifico usando un task Asynchronously desde una base de datos.

    Ejemplo sin uso de Callbacks
    Code (Text):
        public static void getTop(String column){

            Bukkit.getScheduler().runTaskAsynchronously(Core.core, new Runnable() {
                @Override
                public void run() {

                    String query = "SELECT username, "+column+" FROM bedwars ORDER BY ("+column+") DESC LIMIT 10";
                    PreparedStatement ps = null;
                    ResultSet rs = null;

                    try {
                        ps = database.getConnection().prepareStatement(query);
                        rs = database.executeQuery(ps);
                        List<String> top = Lists.newArrayList();
                        if(rs.next()){

                            String username = rs.getString("username");
                            int amount = rs.getInt(column);
                            top.add(username+":"+amount);
                     
                        }

                        return top;
                    }catch(Exception e){
                        e.printStackTrace();
                    }finally {
                        try {
                            ps.close();
                            rs.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }

                }
            });
        }
    Este nos dará un error ya que dentro de un task, no podemos devolver un valor usando "return", ¿Pero entonces como consigo que este valor se me asigne?

    Pues sencillo crearemos nuestro callback usando interfaces

    public interface Callback<T> {
    void done(T valor);
    }

    "T" es el Objeto que vamos a asignar, ya sea Lista, Integer, Boolean, String, HashMap entre otros.

    Usando el callback para obtener el top
    Code (Text):
        public static void getTop(String column, Callback<List<String>> callback){

            Bukkit.getScheduler().runTaskAsynchronously(Core.core, new Runnable() {
                @Override
                public void run() {

                    String query = "SELECT username, "+column+" FROM bedwars ORDER BY ("+column+") DESC LIMIT 10";
                    PreparedStatement ps = null;
                    ResultSet rs = null;

                    try {
                        ps = Core.sql.getConnection().prepareStatement(query);
                        rs = Core.sql.executeQuery(ps);
                        List<String> top = Lists.newArrayList();
                        if(rs.next()){

                            String username = rs.getString("username");
                            int amount = rs.getInt(column);
                            top.add(username+":"+amount);
                        }

                        callback.done(top);
                    }catch(Exception e){
                        e.printStackTrace();
                    }finally {
                        try {
                            ps.close();
                            rs.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }

                }
            });
        }
    Asignamos como parámetro necesario un Callback<List<String>> el cual cuando se ejecute hará llamado al método "done" que asignara el valor requerido (En esté caso la Lista)

    Función
    Code (Text):
        StatsManager.getTop("final_kills", new Callback<List<String>>() {
                @Override
                public void done(List<String> done) {
                    for(String post : done){
                        System.out.println(post); // Imprimir en la consola la lista.
                    }
                }
            });
    Listo hemos creado nuestro callback el cual crea un método requerido llamado "done" con un valor de un objeto (Una Lista), el cual ya puede ser usada sin problemas, con el valor verdadero,
  • Loading...
  • Loading...