2014-03-07 2 views
0

다음 코드는 원격 완성으로 채워지는 자동 완성 텍스트보기입니다. 모든 것이 doInBackground까지 작동하지만 이후에는 onProgressUpdate와 onPostExecute가 호출되지 않습니다. @Override 주석을 사용해 보았지만 이클립스는 그것을 제거하기 위해 불만을 제기했다. 누군가 내가 누락 된 것을 말해 줄 수 있습니까? 왜 작동하지 않는거야?onPostExecute AsyncTask가 호출되지 않았습니다. android

public class MainActivity extends Activity { 
private Spinner pricelistSpinner; 
private AutoCompleteTextView productsView; 
private List<String> pricelist = new ArrayList<String>(); 
private List<String> products = new ArrayList<String>(); 
private ArrayAdapter<String> adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    productsView = (AutoCompleteTextView) findViewById(R.id.autosuggestProducts); 
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, products); 
    adapter.setNotifyOnChange(true); 
    productsView.setAdapter(adapter); 

    productsView.addTextChangedListener(new TextWatcher(){ 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 
     } 

     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 
      if (productsView.getText().toString().length() > 1) { 
       new PricelistAsyncTask().execute(); 
      } 
     } 

    }); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

class PricelistAsyncTask extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
     HttpClient httpClient = new DefaultHttpClient(); 
     String val = productsView.getText().toString(); 
     HttpGet httpGet = new HttpGet("........" + val); 
     try { 
     HttpResponse response = httpClient.execute(httpGet); 
     HttpEntity entity = response.getEntity(); 
     String text = EntityUtils.toString(entity); 

     if (!text.equals("[]")) { 
      String pls = text.substring(1, text.length()-1); 

      List<String> list = Arrays.asList(pls.split(",")); 
      for (int i=0; i<list.size(); i++) { 
       String prod = list.get(i).substring(1, list.get(i).length()-1); 
       list.set(i, prod); 
      } 
      products.clear(); 
      products.addAll(list); 
      for (int i=0; i<list.size(); i++) { 
       Log.d("sometag", products.get(i)); //Works fine till here. 
      } 

     } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     publishProgress(); 
     return null; 
    } 

    protected void onProgressUpdate(String... item) { 
     Log.d("sometag", "Inside onProgressUpdate"); //Not logged, don't know if it is called or not 
    } 
    protected void onPostExecute() { 
     Log.d("sometag", "Inside onPostExecute"); //Not logged, don't know if it is called or not 
     Toast.makeText(getBaseContext(), "Done!", Toast.LENGTH_SHORT).show(); //not shown 
     adapter.clear(); 
     adapter.addAll(products); 
     adapter.notifyDataSetChanged(); //changes don't reflect 
    } 
} 
} 

답변

0

문제는 메서드의 서명에 있습니다. 서명은

  • protected void onPostExecute(Void arg)
  • protected void onProgressUpdate(Void... void)
+0

감사해야합니다! 이제는 작동하고 onPostExecute가 호출되지만 자동 완성 드롭 다운이 제대로 표시되지 않습니다. 예를 들어, "cab"를 입력하면 드롭 다운에서 하위 문자열로 "cab"가 포함 된 항목이 표시되지만 한 문자 'b'를 지우면 하위 문자열로 'cab'가있는 항목의 드롭 다운이 표시됩니다 , 입력 한 다음 문자를 지운 후에 만 ​​작동합니다. 왜 그런가? –

관련 문제