2012-09-13 16 views
6

Actualmente en mi proyecto, estoy haciendo solicitudes Http y deseo que se envíe diferente respuesta http a diferentes métodos de devolución de llamada.Implementación de devolución de llamada de método en Android

Escribí una muestra rápida a continuación para mostrar lo que quiero hacer. Sé que probablemente no sea posible de la manera que quiero, pero ¿hay soluciones claras para lograr lo mismo?

muestra:

Actividad de clase:

public class Main extends Activity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Services service = new Services(); 
     service.login("user", "password", **onLoginComplete()**); 
    } 

    public void onLoginComplete(String HTTPResponse){ 
     // Do something with the response 
    } 
} 

Clase de servicio:

public class Services{ 

    public void login(String user, String password, CALLBACK){ 
     Request request = createLoginRequest(user, password); 
     sendRequest(request, CALLBACK); 
    } 

    public class sendRequest extends AsyncTask{ 
     @Override 
     protected Object doInBackground(Object... params) { 
      // Do Http Request 
      // Get Response 
      CALLBACK(response); 
     } 
    } 
} 

Respuesta

20
interface OnLoginCompleteListener { 
    void onLoginComplete(String response); 
} 

Y luego

public void login(String user, String password, OnLoginComplete listener) { 
    mOnCompleteListener = listener; 
} 

y

protected Object doInBackground(Object... params) { 
    mOnCompleteListener.onLoginComplete(response); 
} 

y finalmente

service.login("user", "password", new OnLoginCompleteListener() { 
    public void onLoginComplete(String response) { 
     // Handle your response 
    } 
}); 
+0

Déjame intentarlo – AlexCheuk

+0

¿Cómo compartirán las dos clases la interfaz OnLoginCompleteListener? – AlexCheuk

+0

Igual que comparte todo el SDK de Android y sus clases :) Ponlo en algún lugar, dentro de su clase de Servicios, por ejemplo. –

0

Hay varias maneras en que puede manejar esto. Puede pasar Runnable para su devolución de llamada o puede proporcionar un método para anular en su clase Services y utilizar una clase anónima derivada de Services en su actividad principal. Si necesita pasar un parámetro, también puede definir una interfaz para algo equivalente al Runnable donde puede definir un método con un parámetro de respuesta.

0

Cómo implementar devoluciones de llamada en java:

public interface SomeCallbackInterface { 
    public void finished(Request req); 
} 

Luego de su clase que hace:

YourReqeust.instantiateWithCallback(new SomeCallbackInterface() { 
    @Override 
    public void finished(Request req){ 
     // do something here 
    } 
}); 

Esto más o menos lo mismo que su hacer con cualquier View.OnClickListener

2

Si entiendo usted correctamente, lo que está tratando de lograr se recomienda que se haga mediante el uso de una AsyncTask. Se explica de una manera muy simple aquí http://developer.android.com/reference/android/os/AsyncTask.html

Además, comparto un ejemplo de cómo ejecuto (doInBackground) GET a un sitio y que se traducen luego leí (onPostExecute) ... espero que ayude!

protected InputStream doInBackground(String... example) { 
    JsonComm jc = new JsonComm(); 
    String baseUrl = "http://www.somewhere.com/get_request.php?data="; 
    String jcString = jc.encodeJSON("nowyou","seeme"); 
    String url = ""; 

    try { 
     url = baseUrl + URLEncoder.encode(jcString, "UTF-8"); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 

    HttpResponse response; 
    HttpClient httpClient = new DefaultHttpClient(); 
    HttpGet request = new HttpGet(url); 
    try { 
     request.setHeader("Accept", "application/json"); 
     request.setHeader("Content-type", "application/json"); 
     response = httpClient.execute(request); 
    } catch (Exception ex) { 
     // handle exception here 
    }finally { 
     httpClient.getConnectionManager().shutdown(); 
    } 
    return response.getEntity().getContent(); 
} 

protected void onPostExecute(InputStream is) { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 

    String line = null; 
    try { 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    System.out.println(sb.toString()); 

} 
2

Creo que tuve el mismo problema que el suyo.

que estaba buscando una buena respuesta y esta fue la aplicación que trabajó para mí:

En primer lugar crear una interfaz que contiene sus métodos; en mi caso yo uso el típico onSuccess y onFailure pero usted puede hacer sus propios métodos:

//MyInterface.java 

public interface MyInterface 
{ 
    void onSuccess(String response); 
    void onFailure(String response); 
} 

A continuación, cree clase Services:

 
//Services.java 

public class Services 
{ 
    public void login(String user, String password, MyInterface myInterface) 
    { 
     Request request = createLoginRequest(user, password); 

     if(/*Request successful*/) 
      myInterface.onSuccess("Login succesful"); 

     else 
      myInterface.onFailure("Login failed"); 
    } 
} 

Y, por último llamar al método en su Activity:

 
//Main.java 

public class Main extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Services service = new Services(); 
     service.login("user", "password", new Myinterface() 
     { 
      @Override 
      public void onSuccess(String response) 
      { 
       Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onFailure(String response) 
      { 
       Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 
+0

¿Qué pasa si mi clase de servicio también es actividad, no pude crear el objeto de Actividad ..! – Shailesh

+0

Eso es correcto, pero, ¿por qué? ¿Quieres un servicio en una actividad? Quiero decir, estás haciendo una autenticación, y necesitas una solicitud asíncrona con las credenciales para el servidor, ese es un servicio con = devolución de llamada = (back-end), y en el actividad que tiene sus entradas y botones (front-end), ¿sabes lo que quiero decir? No estoy seguro de si habría otra manera, no encontré ninguna otra, pero tiene sentido para mí. –

Cuestiones relacionadas