taskPerform = new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... voids) { try { if (rfd == 1) { reader.Actions.Inventory.perform(); isStarted = true; } else { reader.Actions.TagLocationing.Perform(tag, null, null); isStarted = true; } Log.e("yu", "1"); isOpenRead = true; } catch (InvalidUsageException | OperationFailureException e) { e.printStackTrace(); //Log.e("handle_trigger_error", e.getMessage()); } return null; } };Inventory为空怎么解决
时间: 2024-02-10 21:15:44 浏览: 21
在这个代码片段中,如果 `reader.Actions.Inventory` 为空,你需要确保 `reader` 对象已经实例化并正确初始化。如果你已经实例化了 `reader` 对象,但仍然遇到 `Inventory` 为空的问题,那么可能是因为它没有被正确地设置。
你可以尝试添加以下代码:
```
if (reader.Actions.Inventory == null) {
reader.Actions.Inventory = new Inventory();
}
```
这会确保 `Inventory` 对象被正确地初始化。如果你在其他地方重新将 `Inventory` 对象赋值为 `null`,那么你需要检查并确保你的代码逻辑正确,以避免这种情况的发生。
此外,你也可以在调用 `perform()` 方法之前检查 `Inventory` 对象是否为空,以避免空指针异常的发生:
```
if (reader.Actions.Inventory != null) {
reader.Actions.Inventory.perform();
}
```
这将确保只有在 `Inventory` 对象不为空时才调用 `perform()` 方法。
相关问题
不兼容的类型: AsyncTask<Void,Void,List<User>>无法转换为List<User>
这个错误提示表明你尝试将一个 AsyncTask 对象转换为 List<User> 类型,但是这两者是不兼容的类型。
AsyncTask 是 Android 中的一个类,用于在后台线程中执行异步任务,并在执行完成后返回结果给主线程。而 List<User> 是一个泛型类型,表示包含多个 User 对象的列表。
如果你想要获取 AsyncTask 的执行结果,可以在 AsyncTask 中重写 onPostExecute() 方法,并在该方法中返回 List<User> 类型的结果。例如:
```
class MyAsyncTask extends AsyncTask<Void, Void, List<User>> {
@Override
protected List<User> doInBackground(Void... voids) {
// 执行后台任务,并返回 List<User> 类型的结果
List<User> userList = new ArrayList<>();
// ...
return userList;
}
@Override
protected void onPostExecute(List<User> userList) {
// 在主线程中处理执行结果
// ...
}
}
```
然后,在主线程中创建 MyAsyncTask 对象,并调用 execute() 方法来执行异步任务:
```
MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute();
```
在 onPostExecute() 方法中,你可以将 List<User> 类型的结果保存到成员变量中,或者直接使用它来更新 UI 界面等操作。
inventoryButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { if (isFastClick()) { showLoadToast(); goToMainActivity(); loadExcelFile(); } } private boolean isFastClick() { return ButtonOnCilk.isFastViewClick(inventoryButton, getBaseContext()); } private void showLoadToast() { CustomToast.showLoad(HomeActivity.this, getString(R.string.load)); } private void goToMainActivity() { Intent intent = new Intent(getApplicationContext(), MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } private void loadExcelFile() { new AsyncTask<Void, Void, List<String>>() { @Override protected List<String> doInBackground(Void... voids) { return readExcelFile(); } @Override protected void onPostExecute(List<String> data) { showDataInListView(data); } }.execute(); } private void showDataInListView(List<String> data) { listView = findViewById(R.id.rv_list); if (listView != null) { ArrayAdapter<String> adapter = new ArrayAdapter<>(HomeActivity.this, android.R.layout.simple_list_item_1, data); listView.setAdapter(adapter); } } }); private List<String> readExcelFile() { List<String> datas = new ArrayList<>(); try (FileInputStream inputStream = new FileInputStream("/sdcard/Template/IC1001.xlsx"); Workbook workbook = WorkbookFactory.create(inputStream)) { Sheet sheet = workbook.getSheetAt(0); Iterator<Row> rowIterator = sheet.rowIterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); datas.add(cell.toString()); } } } catch (IOException | InvalidFormatException e) { e.printStackTrace(); } return datas; }如何优化,举例说明
这段代码可以进行如下优化:
1. 使用 Lambda 表达式替代匿名内部类,使代码更加简洁。
2. 在读取 Excel 文件时,可以使用 BufferedInputStream 和 BufferedOutputStream 进行缓冲,提高读写效率。
3. 在读取 Excel 文件时,可以将文件路径作为参数传递进来,而不是在代码中写死,提高代码的灵活性。
4. 在读取 Excel 文件时,可以使用 try-with-resources 语句自动关闭流,避免资源泄漏。
5. 在读取 Excel 文件时,可以使用 Apache POI 提供的 CellType 枚举类型判断单元格类型,避免因类型转换错误导致程序异常。
修改后的代码如下:
```
inventoryButton.setOnClickListener(v -> {
if (isFastClick()) {
showLoadToast();
goToMainActivity();
loadExcelFile("/sdcard/Template/IC1001.xlsx");
}
});
private void loadExcelFile(String filePath) {
new AsyncTask<Void, Void, List<String>>() {
@Override
protected List<String> doInBackground(Void... voids) {
return readExcelFile(filePath);
}
@Override
protected void onPostExecute(List<String> data) {
showDataInListView(data);
}
}.execute();
}
private List<String> readExcelFile(String filePath) {
List<String> datas = new ArrayList<>();
try (BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));
Workbook workbook = WorkbookFactory.create(inputStream)) {
Sheet sheet = workbook.getSheetAt(0);
Iterator<Row> rowIterator = sheet.rowIterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
if (cell.getCellTypeEnum() == CellType.STRING) {
datas.add(cell.getStringCellValue());
} else if (cell.getCellTypeEnum() == CellType.NUMERIC) {
datas.add(Double.toString(cell.getNumericCellValue()));
}
}
}
} catch (IOException | InvalidFormatException e) {
e.printStackTrace();
}
return datas;
}
```