我使用的是Android Studio,但我有点卡住了。AsyncTask
我的应用程序是为了在RFID扫描仪上运行,其中一个功能是在一个充满标签的仓库中找到一个特定的标签。
因此,我需要能够在设备在仓库中移动时不断地扫描和读取标签,当发现一个匹配的标签时,设备会发出声音来提醒用户。我通过循环来实现这个功能,但问题是我需要允许用户在点击按钮时取消这个功能,这将建议把搜索标签的工作移到一个异步任务中。
我目前所做的是在onKeyDown事件中,启动读取tag的代码,并更新一个带有tagNumber的变量,然后在这个变量的变化监听器周围设置一个循环,以便在这个事件中提取tag号,如果结果不成功(没有匹配),则调用重新启动keydown事件,并重复这个过程,直到找到匹配的标签。
public boolean onKeyDown(int keyCode, KeyEvent event) {
while (Scan.equals("true")) {
try {
// ReadAction.onStart();
if ((keyCode == KeyEvent.KEYCODE_SOFT_RIGHT || keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT
|| keyCode == KeyEvent.KEYCODE_SHIFT_LEFT
|| keyCode == KeyEvent.KEYCODE_F7 || keyCode == KeyEvent.KEYCODE_F8) && event.getRepeatCount() <= 0
&& ReadAction.mReader.getAction() == ActionState.Stop && ReadAction.mReader.getState() == ConnectionState.Connected) {
ATLog.i(TAG, "INFO. onKeyDown(%d, %d)", keyCode, event.getAction());
mElapsedTick = SystemClock.elapsedRealtime() - mTick;
if (mTick == 0 || mElapsedTick > SKIP_KEY_EVENT_TIME) {
startAction();
mTick = SystemClock.elapsedRealtime();
} else {
ATLog.e(TAG, "INFO. Skip key down event(elapsed:" + mElapsedTick + ")");
return super.onKeyDown(keyCode, event);
}
final String SearchedTagNo = getScannedTag();
ReadAction.setListener(new BaseReadAction.ChangeListener() {
@Override
public void onChange() {
if (Scan.equals("true")) {
String scannedTag= ReadAction.getEpcNo();
if (!SearchedTagNo .equals(scannedTag)) {
onKeyDown(2, keyEvent);
} else if (SearchedTagEPC.equals(EPCTag)) {
//indicate success to user on screen and by sound
mSound.playSuccess();
txtSearchResult.setText(" Found in this Area");
}
}
}
});
return true;
}
} catch (Exception e) {
logWork.AppendLog("ERROR: " + e.getMessage() + " m_KeyDown(), a_AssignTag");
Toast.makeText(Search_Activity.this, e.getMessage().toString(),
Toast.LENGTH_LONG).show();
}
}
return super.onKeyDown(keyCode, event);
}
我想从async类中的doInBackground方法中调用这个onKeyDown方法,但是失败了,从我读到的内容来看,不可能在async taskmethod中访问UI项目。
我读到的其他方法是将它放在 AsyncTask
类,然后从doInBackground中调用发布进度,但这对我来说也不起作用。
class AsyncSearch extends AsyncTask <Void, Void, Void> {
KeyEvent keyEvent;
Search_Activity searchActivity = new Search_Activity(); //thinking this is causing the problem
public AsyncSearch() {
keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, 2);
}
@Override
protected Void doInBackground(Void... params) {
try {
//calling onProgressUpdate to fire, and placing code that needs access to UI thread in the onProgressUpdate method
//because you cannot instantiate a class in a background worker.
publishProgress();
} catch (Exception e) {
throw e;
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
//calls the onKeyDown event in Search_Activity Asynchornously
searchActivity.onKeyDown(2, keyEvent);
}
反正我也找不到类似于.net中的IsInvokeRequired的函数。
有什么我还没有发现的解决方法吗? 我应该完全改变这个问题的方法吗?不知道如何才能让这个搜索继续运行,并监听Cancel点击事件来取消出这个搜索 "循环"