2012-09-13 14 views
6

Attualmente nel mio progetto, sto facendo richieste Http e voglio che la risposta http diversa sia inviata a diversi metodi di callback.Callback del metodo di implementazione in Android

Ho scritto un breve esempio qui sotto per mostrare cosa voglio fare. So che probabilmente non sarà possibile nel modo in cui lo voglio, ma ci sono soluzioni pulite per ottenere la stessa cosa?

Esempio:

Attività Classe:

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 
    } 
} 

Service Class:

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); 
     } 
    } 
} 

risposta

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

E poi

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

e

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

e infine

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

Fammi provare quello – AlexCheuk

+0

In che modo le due classi condividono l'interfaccia OnLoginCompleteListener? – AlexCheuk

+0

Come se condividessi tutto l'SDK di Android e le tue classi :) Mettilo da qualche parte, all'interno della tua classe Servizi, ad esempio. –

0

Ci sono diversi modi per gestire questa situazione. È possibile passare in un Runnable per la richiamata oppure è possibile fornire un metodo per eseguire l'override nella classe Services e utilizzare una classe anonima derivata da Services nell'attività principale. Se è necessario passare un parametro, è possibile definire un'interfaccia per qualcosa di equivalente allo Runnable in cui è possibile definire un metodo con un parametro di risposta.

0

Come implementare callback in Java:

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

Poi nella classe si fa:

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

Questa più o meno la stessa cosa che il vostro fare con qualsiasi View.OnClickListener

2

Se ho capito correttamente, ciò che si sta cercando di ottenere è consigliato tramite l'uso di un AsyncTask. E 'spiegato in un modo molto semplice qui http://developer.android.com/reference/android/os/AsyncTask.html

Inoltre, condivido un esempio di come eseguo (doInBackground) Ottenere richieste a un sito e che risultano poi ho letto (OnPostExecute) ... Spero che aiuta!

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

Penso di avere avuto lo stesso problema del tuo.

ero alla ricerca di una buona risposta e questo era l'implementazione che ha funzionato per me:

Innanzitutto creare un'interfaccia che contiene i metodi; nel mio caso io uso il tipico onSuccess e onFailure ma si può fare i propri metodi:

//MyInterface.java 

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

Poi Crea classe 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"); 
    } 
} 

E infine chiamare il metodo sul 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

e se la mia classe di servizio è anche attività, non potrei creare l'oggetto di attività ..! – Shailesh

+0

Esatto, ma perché vuoi un servizio in a in un'attività? Voglio dire, stai facendo un'autenticazione, e hai bisogno di una richiesta asincrona con le credenziali al server, questo è un servizio con = callback = (back-end), e nel attività hai i tuoi ingressi e pulsanti (front-end), sai cosa intendo ?? Non sono sicuro che ci sarebbe un altro modo, non ho trovato nessun altro, ma ha senso per me. –

Problemi correlati