{ InvalidUsageException hj = null; if (isCancelled()) { return null; } if (readers == null) { return null; } publishProgress("readers.GetAvailableRFIDReaderList()"); if (isCancelled()) { return null; } List<ReaderDevice> list = null; try { list = readers.GetAvailableRFIDReaderList(); } catch (InvalidUsageException e) { e.printStackTrace(); } if (list == null || list.isEmpty()) { return null; } publishProgress("device.getRFIDReader()"); if (isCancelled()) { return null; } for (ReaderDevice readerDevice : list) { device = readerDevice; Log.d("setupLoadReaderTask", readerDevice.getName()); reader = device.getRFIDReader(); Log.d("地址:", readerDevice.getAddress()); if (reader.isConnected()) { return null; } // publishProgress("reader.connect()"); if (isCancelled()) { return null; } try { reader.connect(); // CustomToast.showDismiss(); configureReader(); closeLoad(); } catch (InvalidUsageException e) { e.printStackTrace(); } catch (OperationFailureException e) { if (e.getResults() == RFIDResults.RFID_READER_REGION_NOT_CONFIGURED) { // Get and Set regulatory configuration settings // try { // setDeviceRegion(); // } catch (InvalidUsageException ex) { // ex.printStackTrace(); // } catch (OperationFailureException ex) { // ex.printStackTrace(); // } } else { e.printStackTrace(); } } } if (reader != null && !reader.isConnected()) { return null; } return String.format("连接到 %s", device.getName().substring(0, device.getName().length() - 14)); }
时间: 2024-04-25 22:27:18 浏览: 155
这段代码是一个RFID读写器的连接任务,大致流程如下:
1. 判断是否被取消,如果是则直接返回null。
2. 获取RFID读写器列表。
3. 如果列表为空,则返回null。
4. 遍历读写器列表,获取每个读写器的实例。
5. 如果读写器已经连接,则直接返回null。
6. 尝试连接读写器,如果连接成功则配置读写器并关闭任务,否则捕获异常。
7. 如果异常为RFID_READER_REGION_NOT_CONFIGURED,则尝试设置设备区域,否则打印异常信息。
8. 如果连接成功,则返回连接信息。
需要注意的是,这段代码中的异常类包括InvalidUsageException和OperationFailureException。这两个异常类都是RFID API中的异常类,用于捕获RFID操作中的错误情况。具体异常信息需要根据使用的API和代码上下文进行分析。
相关问题
task = new AsyncTask<Void, String, String>() { @Override protected synchronized String doInBackground(Void... voids) { InvalidUsageException hj = null; if (isCancelled()) { return null; } if (readers == null) { return null; } publishProgress("readers.GetAvailableRFIDReaderList()"); if (isCancelled()) { return null; } List<ReaderDevice> list = null; try { list = readers.GetAvailableRFIDReaderList(); } catch (InvalidUsageException e) { e.printStackTrace(); } if (list == null || list.isEmpty()) { return null; } publishProgress("device.getRFIDReader()"); if (isCancelled()) { return null; } for (ReaderDevice readerDevice : list) { device = readerDevice; Log.d("setupLoadReaderTask", readerDevice.getName()); reader = device.getRFIDReader(); Log.d("地址:", readerDevice.getAddress()); if (reader.isConnected()) { return null; } // publishProgress("reader.connect()"); if (isCancelled()) { return null; } try { reader.connect(); // CustomToast.showDismiss(); configureReader(); closeLoad(); } catch (InvalidUsageException e) { e.printStackTrace(); } catch (OperationFailureException e) { if (e.getResults() == RFIDResults.RFID_READER_REGION_NOT_CONFIGURED) { // Get and Set regulatory configuration settings // try { // setDeviceRegion(); // } catch (InvalidUsageException ex) { // ex.printStackTrace(); // } catch (OperationFailureException ex) { // ex.printStackTrace(); // } } else { e.printStackTrace(); } } }
这段代码是一个异步任务,其 doInBackground 方法中包含了一些连接读写器的操作。在这个方法中,首先判断了任务是否被取消,如果被取消则返回 null。然后通过 readers 的 GetAvailableRFIDReaderList 方法获取可用的读写器列表,如果列表为空则返回 null。接下来,遍历读写器列表,获取每个读写器的设备信息,并尝试连接读写器。如果连接成功则调用 configureReader 方法进行读写器配置,然后关闭加载界面;如果连接失败,则根据不同的异常类型进行相应的处理。在执行过程中,通过 publishProgress 方法将当前进度发布出去,以便在界面上显示加载进度。
public void setupLoadReaderTask() { if (task != null) { task.cancel(true); } if (RfApplication.readers == null) { RfApplication.readers = new Readers(this, ENUM_TRANSPORT.ALL); } task = new AsyncTask<Void, String, String>() { @Override protected synchronized String doInBackground(Void... voids) { InvalidUsageException hj = null; if (isCancelled()) { return null; } if (RfApplication.readers == null) { return null; } publishProgress("readers.GetAvailableRFIDReaderList()"); if (isCancelled()) { return null; } List<ReaderDevice> list = null; list = RfApplication.readers.GetAvailableRFIDReaderList(); if (hj != null){ RfApplication.readers.Dispose(); RfApplication.readers = null; if (RfApplication.readers == null) { RfApplication.readers = new Readers(getApplicationContext(), ENUM_TRANSPORT.BLUETOOTH); } } if (list == null || list.isEmpty()) { return null; } publishProgress("device.getRFIDReader()"); if (isCancelled()) { return null; } for (ReaderDevice readerDevice : list) { RfApplication.device = readerDevice; RfApplication.deviceName = readerDevice.getName(); Log.d("deviceName", readerDevice.getName()); RfApplication.reader = RfApplication.device.getRFIDReader(); // Log.d("地址:",readerDevice.getAddress()); if (RfApplication.reader.isConnected()) { return null; } publishProgress("reader.connect()"); if (isCancelled()) { return null; } try { RfApplication.reader.connect(); isStarted = true; configureReader(); } catch (InvalidUsageException | OperationFailureException e) { } if (RfApplication.reader.isConnected()) { break; } } if (!RfApplication.reader.isConnected()) { return null; } if (RfApplication.device.getName().startsWith("RFD8500") || RfApplication.device.getName().startsWith("RFD40")) { try { RfApplication.reader.Config.setBeeperVolume(BEEPER_VOLUME.QUIET_BEEP); RfApplication.reader.Config.setTriggerMode(ENUM_TRIGGER_MODE.BARCODE_MODE,false); RfApplication.reader.Config.setTriggerMode(ENUM_TRIGGER_MODE.RFID_MODE,true); } catch (InvalidUsageException | OperationFailureException e) { } } return String.format(getString(R.string.connect), RfApplication.device.getName().substring(0,RfApplication.device.getName().length()-14)); } @Override protected void onProgressUpdate(String... values) { } @Override protected void onPostExecute(String s) { if (s == null) { if (isStarted == false){ setupRetryDialog(); } } else { CustomToast.showLoad(HomeActivity.this,s,2000); } } @Override protected void onCancelled() { RfApplication.reader = null; RfApplication.readers = null; CustomToast.showToast(HomeActivity.this,getString(R.string.no_reader),2000); } }; task.execute(); }com.zebra.rfid.api3.InvalidUsageExceptionat com.ives.upcrfid_zebra.HomeActivity$12.doInBackground(HomeActivity.java:519)at com.ives.upcrfid_zebra.HomeActivity$12.doInBackground(HomeActivity.java:504)怎么解决
这段代码中可能存在的问题包括:
1. 在任务执行前,可能需要检查某些条件是否满足,例如设备是否已经连接,以避免在异步任务执行期间出现问题。你需要检查代码中是否有这样的检查。
2. 在 `doInBackground()` 方法中,当 `RfApplication.readers.GetAvailableRFIDReaderList()` 返回 `null` 或空列表时,任务会直接返回 `null`,并且不会关闭 `RfApplication.reader`,这会导致资源泄漏。你需要添加关闭 `RfApplication.reader` 的逻辑。
3. 在任务执行期间,如果任务被取消,需要及时清理资源。你需要确保在 `onCancelled()` 方法中清除所有可能已分配的资源。
4. 在 `doInBackground()` 方法中,当调用 `RfApplication.reader.connect()` 时可能会发生 `InvalidUsageException` 或 `OperationFailureException` 异常,但是在捕获这些异常后没有进行任何处理,这会导致任务终止。你需要添加处理这些异常的逻辑。
针对以上问题,你可以尝试以下解决方案:
1. 在 `setupLoadReaderTask()` 方法中添加必要的前置条件检查,例如检查设备是否已连接。
2. 在 `doInBackground()` 方法中添加关闭 `RfApplication.reader` 的逻辑,例如在 `if (!RfApplication.reader.isConnected())` 分支中添加 `RfApplication.reader.PostDisconnectCleanup();`。
3. 在 `onCancelled()` 方法中清除所有可能已分配的资源,例如添加 `task = null;`、`RfApplication.reader = null;` 和 `RfApplication.readers = null;`。
4. 在 `doInBackground()` 方法中添加处理 `InvalidUsageException` 和 `OperationFailureException` 的逻辑,例如在 `catch` 块中记录错误日志或者提示用户操作失败的信息。
阅读全文