我有一个简单的片段,在该列表的顶部有一个ListView和EditText。我正在使用EditText,因此我的蓝牙条码扫描器可以写入它。问题是,当我开始快速扫描时,我的程序无法在ui线程上执行任何操作。我正在使用AsyncTask进行数据库插入,但如果我在使用扫描仪发送垃圾邮件时更新我的视图,我就会开始从我正在拦截的条形码中删除字符。有没有什么好方法可以解决这个问题?我想到的最好的事情是:Android: force onKeyListener to wait但是这不是用户友好的,我会在输入中垃圾邮件直到我的用户停止一秒钟,问题是如果第二次通过并且他试图在视图得到刷新之后插入一些东西,以便再次被阻挡。这可以通过任何其他方式解决,以便我可以实时更新listview和垃圾邮件代码吗?
P.S。我不知道会读什么类型的条形码所以我不能只依赖长度。
这就是我在片段中的onActivityCreated事件中所做的事情:
EditText docEditFieldName;
docEditFieldName = (EditText) getActivity().findViewById(R.id.posEditField);
docEditFieldName.requestFocus();
docEditFieldName.setOnKeyListener(new EditText.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER))) {
EditText posEditFieldName = (EditText) getActivity().findViewById(R.id.posEditField);
String barkoda = posEditFieldName.getText().toString();
posEditFieldName.setText("");
posEditFieldName.requestFocus();
createPositionManual(barkoda);
return true;
}
return false;
}
});
createPositionManual是一种调用异步任务的方法。完成后的异步任务调用接口并更新视图。
编辑(myAsyncTask):
protected class testtask extends AsyncTask<String, String, String>
{
public String mParam; // member variable to parameterize the function
@Override
protected String doInBackground(String... arg0) {
SQLiteHelper sqlh = SQLH.getHelper(); // My helper is static
if (arg0[0].length() > 0) {
InvDokPoz invdokpoz = new InvDokPoz(Integer.parseInt(arg0[1]), arg0[0], 1.0, "mjav");
Log.d("insertingInto", Integer.toString(Integer.parseInt(arg0[1])));
sqlh.addInvDokPoz(invdokpoz);
}
return arg0[0];
}
protected void onPostExecute(String result)
{
loadPositionData(); // Refresh view
}
}