2013-07-26 23 views
11

Bir kütüphane web sitesine erişmek için bir arama işlevi yazıyorum.Veri sorgu dizisi gönderildiğinde, program web üzerinde infos ayrıştırmak için yeni bir iş parçacığı başlattı. normalde AVD üzerinde çalışıyor ancak HTC DesireHD cihazım arama sonuçlarını sürekli olarak gösteriyor (eğer gerçek sonuçlar 1 ise. 2. 2. gibi görünecektir. 2. 3. 1. 2. 3.). OnQueryTextSubmit yönteminde kesme noktaları belirledim, onQueryTextSubmit() yöntemindeki kodların iki kez yürütüldüğünü fark ettim. düğmesine bir kez onQueryTextSubmit iki kez ateşlenmesine neden olur tıklayarak bu olabilir OS tarafından kontrol edilmektedir olarak çözmek mümkün olmayabilir kendi başına bir sorun olmasının nedeniSearchView onQueryTextSubmit bir kez bastığımda iki kez çalıştırıyor

sv.setOnQueryTextListener(new OnQueryTextListener(){ 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      list.clear(); 
      String str = null; 
      try {//encoding Chinese character 
       str = new String(query 
         .trim().getBytes(), "ISO-8859-1"); 
       } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } 
      SearchPost sp = new SearchPost(SEARCH_URL + str); 
      new Thread(sp).start(); 
      return false; 
     } 
    }); 

protected class SearchPost implements Runnable{ 
    public String url = ""; 
    SearchPost(String urls){ 
     url = urls; 
    } 
    public SearchPost() { 
    } 
    @Override 
    public void run() { 
     Message message = handler.obtainMessage(); 
     message.what = DOWNLOAD_COMPLETE; 
     try{ 
      doc = Jsoup.connect(url).get(); 
       handler.sendMessage(message); 
     }catch(IOException e){ 
      e.printStackTrace(); 
      message.what = DOWNLOAD_FAIL; 
      handler.sendMessage(message); 
     } 
    } 
} 
+0

Bu yöntemin yanlış değerini neden verdiniz? –

cevap

3

dışarı bulma: ve burada benim kodudur buggy. Asıl soru, düğmenin iki kez veya daha fazlasında hızlı bir şekilde tıklandığı durumun düzgün bir şekilde ele alınmasıdır, ki bu muhtemelen aynı etkiye sahip olacaktır. Listeyi doldurduğunuz yerdeki list.clear() öğesinin taşınmasını öneririm.

+0

Öneri list.clear(), önerdiğiniz gibi work.but bağlantı iş parçacığı hala iki kez yürütülür, sol program potansiyel bir hata ... her neyse teşekkürler ~ – futureer

+0

Programınızın çalıştığı platformda OK, tıklarsanız ne olur? hızlı bir sekansta iki kez mi? – Tarik

+0

HTC'nin yaptığı gibi tekrarlanan görüntü sanırım ve bunun neden olduğunu anladım --- "search" e basmak, ACTION_DOWN ve ACTION_UP, her iki tetikleme gönderme yöntemini de bazı devices.it üretiyor, kontrol edemediğimiz bir hata ortaya çıkıyor haklısın. – futureer

1

Bu sorunun nedenini ve çözümünü aramaya devam ediyorum ve bir şeyler buluyorum. gerçekleşmesi nedeni: https://code.google.com/p/android/issues/detail?id=24599

klavye iki önemli olay ACTION_DOWN ve ACTION_UP üretir ve bazı cihaz (sözde sadece ACTION_UP tepki) hem bu iki mesajın tepki vereceğini kullanıcı arama tuşuna bastığında aksiyon, SDK veya Cihazın kendileri tarafından bizim geliştiriciler tarafından kontrol edilemeyen bir böcek olduğu ortaya çıkıyor.

Bunu çözmek için, ACTION_UP değerini geçersiz kılmak için sorguyu boşaltmak üzere "sv.setIconified()" ifadesini ekliyorum.

+0

Bu, asıl sorun. Yine de, devam eden veya bitmiş bir sorguyu yeniden çalıştırmama (örneğin sorgu dizgisini - örneğin sorgu dizgisiyle - ve aynı sorguyu yeniden çalıştırmanın bir yolu, ancak bir süre sonra) yeniden çözmeyi tercih ederim. .Her durumda dağınık. – desseim

26

SearchView'taki temizlemenin odaklanması Searcher bana yardımcı oldu.

sv.clearFocus();

Not: Bu, klavyeyi de gizler.

+0

çalıştı. Teşekkürler :) –

1

Sorun, kullanıcının klavyede arama tuşuna bastığında, iki önemli olay ACTION_DOWN ve ACTION_UP üretmesi ve bazı aygıtların bu iki iletiye de tepki vermesidir.

Ben setIconified() sevmiyorum, sonra metin, sadece saniyede bir arama yapmasına izin silinir arandı, bu nedenle bu yapmış çünkü basit bir şekilde çözülebilir

:

public boolean onQueryTextSubmit(String s) { 

    long actualSearchTime = (Calendar.getInstance()).getTimeInMillis(); 
    // Only one search every second to avoid key-down & key-up   
    if (actualSearchTime > lastSearchTime + 1000) 
    { 
     lastSearchTime=actualSearchTime; 
    } 
} 
1

I Bu sorunu aldım çünkü _searchView.setInputType (InputType.TYPE_NULL) ;, bu satırı kaldırarak bu satırın kaldırılmasıyla