En primer lugar, soy bastante novato en Java, así que si la pregunta no tiene sentido, hágamelo saber.

Básicamente, estoy creando una aplicación de Android que se comunica con mi servicio web, por lo que hice una clase separada para tratar la comunicación, que también incluye AsyncTask (eliminé mucho del código aquí solo para obtener una vista previa):

public class api {

private String caller = null;
Context that = null;

api(Context that) {

    this.that = that;
    this.caller = that.getClass().getSimpleName();

}

void call(String action) {

    /* .... */

    }

    new back().execute(param1, param2);

}

void callback(String action, String result){

    that.callback(action, result);

}



public class back extends AsyncTask<String, Void, String> {

    public String response = null;

    protected String doInBackground(String... params) {

        response = connection.executeRequest(params[1]);
        return response;

    }

    protected void onPostExecute(String result) {

        callback("a", "b");                 

    }

}    


}

Y cuando uso la clase de alguna parte de la aplicación (digamos SomeClass.class), hago:

api WS = new api(this);
WS.call("....");

Y se supone que debe ejecutar la función 'devolución de llamada' que está en SomeClass. Pero el problema clave aquí es esta línea:

that.callback(action, result);

Eclipse me hace agregar el nombre de la clase "llamador" en el elenco:

(SomeClass) that.callback(action, result);

Pero eso no funciona para mí, porque uso la clase 'api' de muchas clases diferentes, por lo que idealmente necesito poner una variable en el elenco. Obtengo el nombre de la clase "llamador" aquí:

this.caller = that.getClass().getSimpleName();
//obviously this won't work:
(this.caller) that.callback(action, result);

¿Hay alguna forma de hacer eso, o estoy haciendo algo fundamentalmente mal?

Gracias.

0
void0 3 dic. 2011 a las 03:41

1 respuesta

La mejor respuesta

Actualmente, su clase api acepta un objeto Context en su constructor predeterminado. Tendría más sentido extender Context con una nueva clase que contiene un método de devolución de llamada que luego puede anular en subclases como SomeClass, que anularía la necesidad de conversión en su clase api. p.ej:

public class APIContext extends Context
{
    public void callback( String action, String result )
    {
        /* ... */
    }
}

public class SomeClass extends APIContext
{
    @Override
    public void callback( String action, String result )
    {
        /* ... */
    }
}

public class api
{
    private APIContext callerContext = null;

    public api( APIContext context )
    {
        this.callerContext = context;
    }

    public void callback( String action, String result )
    {
        callerContext.callback( action, result );
    }
}
1
wrren 3 dic. 2011 a las 04:03
¿Tengo razón al decir que public class SomeClass extends APIContext no va a funcionar porque ahora mismo extiende la Actividad?
 – 
void0
3 dic. 2011 a las 04:10
Puede tener una clase APIActivity que tenga la misma firma de método y luego hacer que SomeClass la implemente. Luego, pase un objeto APIActivity a la instancia de api como parámetro del constructor. ¿Hay alguna razón en particular por la que desee pasar una instancia de contexto? Activity (y APIActivity, si lo escribe) extienden Context para que no pierda ninguna funcionalidad si lo pasa en su lugar.
 – 
wrren
3 dic. 2011 a las 04:20
Contexto que estoy pasando para poder acceder a la función callback () de la persona que llama después de que AsyncTask haya terminado; no encontré ninguna otra forma adecuada sin hacer que la función sea estática. Ampliación de la actividad según su ejemplo funcionó maravillosamente bien, ¡muchas gracias!
 – 
void0
3 dic. 2011 a las 04:32