我正在使用Android Studio,但在AsyncTask
上有些卡住
我的应用程序旨在在RFID扫描仪上运行,其功能之一是在装满标签物品的仓库中找到一个特定的标签。
因此,当设备在仓库中移动时,我需要能够连续扫描和读取标签,当找到匹配项时,设备会发出声音来提醒用户。我将其与循环配合使用,但问题是我需要允许用户单击按钮才能取消此操作,这建议将标记的搜索移至异步任务。
我目前正在做的是在onKeyDown事件中,触发执行读取标签的代码,并使用tagNumber更新变量,然后在该变量的更改侦听器周围放一个循环,以在此事件中提取标签号,如果结果为失败(不匹配)调用,重新触发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方法/事件,但是它失败了,并且从我的阅读中无法访问异步任务/方法中的UI项
我读过的替代方法是将其放在
AsyncTask
类的onProgressUpdate方法中,并从doInBackground调用publish进度,但这对我也不起作用。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);
}
没有类似IsInvokeRequired的等效项,就像我将在.net中使用的那样...
我有没有偶然发现的解决方法?我是否应该完全改变解决此问题的方法?不确定如何保持此搜索的运行状态并听取“取消点击”事件以取消此搜索“循环”
最佳答案
我已经有一天对此表示怀疑,因此我没有找到解决方案(我快疯了),所以我找到了读取android developer official guide的解决方案。我注意到我在做类似您的问题的操作,并且走错了路,因为当前Activity上运行的任何循环都将始终阻止UI交互。
解:
解决此问题的方法是,至少创建两个可运行的类(扩展线程),以使它们都可以在不同于当前Activity的新线程中运行。
创建第一个可运行类仅用于管理连接的生命周期,并创建另一个可在rfid设备和智能手机之间交换消息的类。
我建议您研究这个简单的BluetoothChat example,也许您会得到解答。
希望本文对您有所帮助!
问候,
雷南·施罗德