我正在使用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,也许您会得到解答。

希望本文对您有所帮助!

问候,
雷南·施罗德

10-08 15:33