2014-03-07 100 views
0

我有以下一段代码为远程填充自动完成文本视图,一切工作正常,直到doInBackground,但之后,onProgressUpdate和onPostExecute都没有被调用。我尝试使用@Override注释,但Eclipse抱怨删除它,并且我也读了它不是必需的。有人能告诉我我错过了什么吗?为什么它不起作用?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”作为子字符串的项目的下拉列表,它只在我输入并删除一个字母后才起作用。任何想法为什么? –

相关问题