2017-09-26 5 views
0

J'utilise Google Autocomplete API Lieux avec Android et ce que je suis en train de faire est:Comment créer Singleton OkHtpp classe et gérer les demandes précédentes

  1. Chaque fois que l'utilisateur de type char à l'intérieur de la EditText il doit faire une nouvelle demande pour obtenir les résultats des prédictions.
  2. Je dois annuler la demande précédente car le seul résultat dont j'ai besoin est l'adresse/l'emplacement final que l'utilisateur a tapé.
  3. Ensuite, établissez une logique pour nettoyer RecyclerView si la longueur de l'emplacement est inférieure à 3 caractères.

Voilà pourquoi je besoin d'une instance singleton, j'ai essayé ceci:

public class OkHttpSingleton extends OkHttpClient { 
private static OkHttpClient client = new OkHttpClient(); 

public static OkHttpClient getInstance() { 
    return client; 
} 

public OkHttpSingleton() {} 

public void CloseConnections(){ 
    client.dispatcher().cancelAll(); 
} 
public List<PlacePredictions> getPredictions(){ 
    //// TODO: 26/09/2017 do the request! 
    return null; 
} 

}

Mais je ne suis pas sûr si elle est la bonne façon de le faire, parce que dans le doc il dit que la méthode dispatcher().cancelAll() annule toutes les demandes Mais je sais que c'est faux! Je suis plus préoccupé par la façon de créer un singleton que le reste.

L'activité principale:

Address.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      if(s.length() > 3){ 
       _Address = Address.getText().toString(); 
       new AsyncTask<Void, Void, String>() { 
        @Override 
        protected void onPreExecute() { 
         super.onPreExecute(); 
        } 

        @Override 
        protected String doInBackground(Void... params) { 
         try { // request... 
        }else{Clear the RecyclerView!} 

Répondre

1

Vous pouvez mettre en œuvre une classe d'aide singleton qui maintient un OkHttpClient et couvrir toutes vos fonctionnalités personnalisées à l'aide celui-ci client particulier:

public class OkHttpSingleton { 

    private static OkHttpSingleton singletonInstance; 

    // No need to be static; OkHttpSingleton is unique so is this. 
    private OkHttpClient client; 

    // Private so that this cannot be instantiated. 
    private OkHttpSingleton() { 
     client = new OkHttpClient.Builder() 
      .retryOnConnectionFailure(true) 
      .build(); 
    } 

    public static OkHttpSingleton getInstance() { 
     if (singletonInstance == null) { 
      singletonInstance = new OkHttpSingleton(); 
     } 
     return singletonInstance; 
    } 

    // In case you just need the unique OkHttpClient instance. 
    public OkHttpClient getClient() { 
     return client; 
    } 

    public void closeConnections() { 
     client.dispatcher().cancelAll(); 
    } 

    public List<PlacePredictions> getPredictions(){ 
     // TODO: 26/09/2017 do the request! 
     return null; 
    } 
} 

Exemple d'utilisation:

OkHttpSingleton localSingleton = OkHttpSingleton.getInstance(); 
... 
localSingleton.closeConnections(); 
... 
OkHttpClient localClient = localSingleton.getClient(); 
// or 
OkHttpClient localClient = OkHttpSingleton.getInstance().getClient(); 
+0

Une question de plus, comment je vais accéder à 'closeConnectio ns' et getPredictions()? –

+0

'localClient.closeConnections()'? – Mehmed

+0

il ne trouve pas par l'objet! –