Android: Howto sendet Anfragen an die Google API, wenn ein Benutzer die Eingabe pausiert?

Ich arbeite an dieser App, wo Benutzer einen Standort in einem autoCompleteTextView eingeben können und es wird Orte vorstellen, die auf dem Google Places Api basieren, wie hier beschrieben wird.

Allerdings möchte ich die Menge der Anfrage, die von der App gesendet wird, nur durch das Senden von Anfragen beschränken, wenn der Benutzer die Eingabe für eine bestimmte Zeitspanne stoppt. Wer weiß, wie man das macht?

  • ConnectivityManager getNetworkInfo (int) veraltet
  • Wie sicher sind Client-SSL-Zertifikate in einer mobilen App?
  • Beende alle bisherigen Aktivitäten
  • Android - DataBinding mit Präferenzaktivität
  • ./fastboot: Keine solche Datei oder Verzeichnis
  • Wie öffne ich eine App aus meinem Webbrowser (Chrome) in Android? Was muss ich mit dem A Href Link machen?
  • Kann nicht GcmBroadcastReceiver instanziieren
  • Silbentrennung in Android
  • Wie man die Kamera direkt im Panorama- / Photosphären-Modus öffnet?
  • So verschieben Sie die Tasten Text, wenn der Zustand gedrückt wird
  • Android kann Host nicht auflösen
  • Hinzufügen von Markierungen aus der URL mit Picasso
  • 4 Solutions collect form web for “Android: Howto sendet Anfragen an die Google API, wenn ein Benutzer die Eingabe pausiert?”

    Ähnlich wie diese Antwort, aber etwas prägnanter und ohne zusätzlichen Staat. Sie brauchen auch nicht die Schwellenprüfungen, da performFiltering nur aufgerufen wird, wenn die Filterung tatsächlich erforderlich ist.

    Subclassing AutoCompleteTextView scheint der einzige Weg zu gehen, da man den von TextWatcher hinzugefügten AutoCompleteTextView nicht überschreiben / ersetzen AutoCompleteTextView .

     public class DelayAutoCompleteTextView extends AutoCompleteTextView { public DelayAutoCompleteTextView(Context context, AttributeSet attrs) { super(context, attrs); } private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { DelayAutoCompleteTextView.super.performFiltering((CharSequence) msg.obj, msg.arg1); } }; @Override protected void performFiltering(CharSequence text, int keyCode) { mHandler.removeMessages(0); mHandler.sendMessageDelayed(mHandler.obtainMessage(0, keyCode, 0, text), 750); } } 

    Ich habe eine Lösung für das oben genannte Problem gefunden, das ganz schön funktioniert. Ich habe das AutoCompleteTextView auf folgende Weise erweitert. Wenn jemand weiß, wie man diesen Code weiter verbessern kann, lass es mich wissen.

     public class MyAutoCompleteTextView extends AutoCompleteTextView { // initialization int threshold; int delay = 750; Handler handler = new Handler(); Runnable run; // constructor public MyAutoCompleteTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void performFiltering(final CharSequence text, final int keyCode) { // get threshold threshold = this.getThreshold(); // perform filter on null to hide dropdown doFiltering(null, keyCode); // stop execution of previous handler handler.removeCallbacks(run); // creation of new runnable and prevent filtering of texts which length // does not meet threshold run = new Runnable() { public void run() { if (text.length() > threshold) { doFiltering(text, keyCode); } } }; // restart handler handler.postDelayed(run, delay); } // starts the actual filtering private void doFiltering(CharSequence text, int keyCode) { super.performFiltering(text, keyCode); } } 

    Sie könnten einen TextWatcher verwenden und wie lange zwischen den Texteingaben überwachen Ich persönlich mag nicht die Idee der Sub-Klassifizierung native Android-Kontrollen (obwohl, es ist sicherlich ein gültiger Ansatz, nur nicht meine bevorzugte Ansatz).

    Die docs: http://developer.android.com/reference/android/text/TextWatcher.html

    Und ein SO-Link: Wie benutzt man die TextWatcher-Klasse in Android?

    Ähnlich wie bei den obigen Antworten habe ich gefunden, dass ich die AutoCompleteTextView subklassen musste. Allerdings, weil Internet ist ein bisschen langsam, wo ich lebe, fand ich, dass das Entfernen der verspäteten Handler jedes Mal, wenn der Benutzer einen Schlüssel gedrückt wurde ein Problem. Also im Grunde, wenn ich nur den Filter lief vielleicht 500ms, nachdem der Benutzer aufgehört zu schreiben, könnte es Sekunden dauern, bis die Ergebnisse erscheinen, was den Benutzer verärgert machen würde.

    Also, stattdessen, ich weiß nicht, die Handler jedes Mal, und lassen Sie filtern laufen alle paar hundert ms. Mein Code ist viel weniger sauber Jan Berkel's. Ich bin sicher, Sie können es ein bisschen reinigen Ich bin zu faul, aber Leistung ist besser in Bereichen mit langsamen Internet IMO.

     public class CustomCompleteView extends AutoCompleteTextView{ Handler handler=new Handler(); Runnable r; boolean cleartogo=false; boolean pending =false; CharSequence btext; int bkeyCode; public CustomCompleteView(Context context) { super(context); // TODO Auto-generated constructor stub } public CustomCompleteView(Context context, AttributeSet attrs) { super(context,attrs); } public CustomCompleteView(Context context, AttributeSet attrs, int defStyle) { super(context,attrs,defStyle); } @Override public void performFiltering(CharSequence text, int keyCode){ if (cleartogo){ cleartogo=false; Log.d(MainActivity.DTAG,"Going to filter on " + text.toString()); pending=false; super.performFiltering(btext, bkeyCode); } else { Log.d(MainActivity.DTAG,"Filtering rejected, too soon"); btext=text; bkeyCode=keyCode; if (!pending){ if (r==null) r=new MyRunnable(this); //try{handler.removeCallbacks(r);} catch (Exception ex){}; handler.postDelayed(r, 500); pending=true;} } } private class MyRunnable implements Runnable { CustomCompleteView bc; MyRunnable(CustomCompleteView c ) { this.bc=c; } public void run() { Log.d(MainActivity.DTAG,"Special Runnable running"); cleartogo=true; bc.performFiltering(btext, bkeyCode); } } } 
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.