From b1a89e1f05cd36aaa8d456063e9eede7ce01fea0 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Mon, 9 Jan 2023 14:39:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=87=87=E9=9B=86=E5=9B=BE=E7=89=87=E6=8D=9F=E5=9D=8F=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../activity/AutoTakePictureActivity.java | 161 +++++++++++------- 2 files changed, 99 insertions(+), 66 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ac65e7e..b61baec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.navinfo.outdoor" minSdkVersion 23 targetSdkVersion 30 - versionCode 40 - versionName "8.221219" + versionCode 41 + versionName "8.230109" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } lintOptions { diff --git a/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java index def47f4..35635af 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java @@ -154,12 +154,14 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.TimeZone; import java.util.Timer; import java.util.TimerTask; @@ -1309,83 +1311,113 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic /** * 结束采集,对照片归档 * */ - private boolean hasFinishTask = false; // 当前是否包含已完成任务未处理完 + private int finishTaskCount = 0; + private boolean wantBack = false; // 用户是否想要退出当前界面,如果当前有正在处理的图片转移任务,会阻挡用户退出,此时该值状态置为true,当照片处理完后,可以对话框提示用户退出 private void finishRoadTask(Map finishEntityMap) { - hasFinishTask = true; - Observable.fromIterable(finishEntityMap.values()) - .subscribeOn(Schedulers.io()).observeOn(Schedulers.computation()) - .filter(roadMatchEntity -> roadMatchEntity!=null) - .map(roadMatchEntity -> { - // 判断是否已领取,未领取则调用领取数据接口 - PoiEntity poiEntity = poiDao.getTaskIdPoiEntity(roadMatchEntity.getId()); - if (poiEntity == null) { - // 数据库中不存在,尝试再次领取 - InsertAndUpdateUtils.getInstance().insertOrUpdate(AutoTakePictureActivity.this, translateRoadMatchEntity(roadMatchEntity)); - // 调用网络领取任务 - receiverRoadTask(roadMatchEntity).subscribe(receiveObserver); - } + if (finishEntityMap!=null&&!finishEntityMap.isEmpty()) { + finishTaskCount++; - List recorderList = recorderDao.getLocationRecorderByTime(roadMatchEntity.getStartMatchTime(), roadMatchEntity.getEndMathchTime()); - File recorderFolder = new File(Constant.PICTURE_FOLDER+"/"+poiEntity.getId()); - if (!recorderFolder.exists()) { - recorderFolder.mkdirs(); - } - // 编辑paper.txt - // 复制图片文件 - File paperFile = new File(recorderFolder.getAbsolutePath(), "paper.txt"); - for (int i = 0; i < recorderList.size(); i++) { - File originImg = new File(recorderList.get(i).getImgFileName()); - File destFile = new File(recorderFolder.getAbsolutePath()+"/"+i+".jpg"); - if (!destFile.exists()) { - FileUtils.copyFile(originImg.getAbsolutePath(), destFile.getAbsolutePath()); + Observable.fromIterable(finishEntityMap.values()) + .subscribeOn(Schedulers.io()).observeOn(Schedulers.computation()) + .filter(roadMatchEntity -> roadMatchEntity!=null) + .map(roadMatchEntity -> { + // 判断是否已领取,未领取则调用领取数据接口 + PoiEntity poiEntity = poiDao.getTaskIdPoiEntity(roadMatchEntity.getId()); + if (poiEntity == null) { + // 数据库中不存在,尝试再次领取 + InsertAndUpdateUtils.getInstance().insertOrUpdate(AutoTakePictureActivity.this, translateRoadMatchEntity(roadMatchEntity)); + // 调用网络领取任务 + receiverRoadTask(roadMatchEntity).subscribe(receiveObserver); } - FileUtils.writeFile(paperFile.getAbsolutePath(), recorderList.get(i).toString(picFormatter ,i), true); - } - return poiEntity; - }) - .doOnNext(poiEntity -> { - // 网络提交数据 - if (poiEntity!=null) { - // 提交数据,更新状态 - roadSaveWork(poiEntity); + List recorderList = recorderDao.getLocationRecorderByTime(roadMatchEntity.getStartMatchTime(), roadMatchEntity.getEndMathchTime()); + File recorderFolder = new File(Constant.PICTURE_FOLDER+"/"+poiEntity.getId()); + if (!recorderFolder.exists()) { + recorderFolder.mkdirs(); + } + // 编辑paper.txt + // 复制图片文件 + File paperFile = new File(recorderFolder.getAbsolutePath(), "paper.txt"); + for (int i = 0; i < recorderList.size(); i++) { + File originImg = new File(recorderList.get(i).getImgFileName()); + File destFile = new File(recorderFolder.getAbsolutePath()+"/"+i+".jpg"); + if (!destFile.exists()) { + FileUtils.copyFile(originImg.getAbsolutePath(), destFile.getAbsolutePath()); + } + FileUtils.writeFile(paperFile.getAbsolutePath(), recorderList.get(i).toString(picFormatter ,i), true); + } + + return poiEntity; + }) + .doOnNext(poiEntity -> { + // 网络提交数据 + if (poiEntity!=null) { + // 提交数据,更新状态 + roadSaveWork(poiEntity); /*poiEntity.setTaskStatus(3); InsertAndUpdateUtils.getInstance().insertOrUpdate(AutoTakePictureActivity.this, poiEntity);*/ - } - }) - .observeOn(AndroidSchedulers.mainThread()) - .onErrorResumeNext(new Function>() { - @Override - public ObservableSource apply(Throwable throwable) throws Exception { - return null; - } - }) - .subscribe(new Consumer() { - @Override - public void accept(PoiEntity poiEntity) { + finishEntityMap.remove(poiEntity.getTaskId()); + } + }) + .observeOn(AndroidSchedulers.mainThread()) + .onErrorResumeNext(Observable.empty()) + .subscribe(new Consumer() { + @Override + public void accept(PoiEntity poiEntity) { // // 已经处理过该任务,将其从finish列表中移除 // if (poiEntity!=null) { // finishEntityMap.remove(poiEntity.getTaskId()); // } - } - }, new Consumer() { + + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) { + // 此处异常可能是服务返回的数据无法解析,但http正常返回了,因此可能为程序问题,不再重复尝试上报 + systemTTS.playText("注意,领取任务失败!"); + XLog.e("完成失败:"+throwable.getMessage()); + ToastUtils.Message(AutoTakePictureActivity.this, throwable.getMessage()); + finishTaskCount--; + if (finishTaskCount == 0) { + showExitDialog(true); + } + } + }, new Action() { + @Override + public void run() throws Exception { + // 重新绘制网络任务和本地任务 + initRoadLine2Map(); + finishTaskCount--; + if (finishTaskCount == 0) { + showExitDialog(false); + } + } + }); + } + } + + private void showExitDialog(boolean hasError) { + StringBuilder dialogMessage = new StringBuilder("任务数据处理完成,是否退出当前界面"); + if (hasError) { + dialogMessage.append("(注意,其中有部分任务处理失败)"); + } + MessageDialog.show(AutoTakePictureActivity.this, "退出当前界面", dialogMessage) + .setOkButton("确定", new OnDialogButtonClickListener() { @Override - public void accept(Throwable throwable) { - // 此处异常可能是服务返回的数据无法解析,但http正常返回了,因此可能为程序问题,不再重复尝试上报 - systemTTS.playText("注意,领取任务失败!"); - XLog.e("完成失败:"+throwable.getMessage()); - ToastUtils.Message(AutoTakePictureActivity.this, throwable.getMessage()); - hasFinishTask = false; + public boolean onClick(BaseDialog baseDialog, View v) { + AutoTakePictureActivity.this.finish(); + return false; } - }, new Action() { + }) + .setCancelButton("取消", new OnDialogButtonClickListener() { @Override - public void run() throws Exception { - // 重新绘制网络任务和本地任务 - initRoadLine2Map(); -// finishEntityMap.clear(); - hasFinishTask = false; + public boolean onClick(BaseDialog baseDialog, View v) { + baseDialog.doDismiss(); + wantBack = false; + return false; } - }); + }) + .show(); } private void roadSaveWork(PoiEntity poiEntity) throws IOException { @@ -1692,8 +1724,9 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic @Override public void onBackPressed() { DialogSettings.style = DialogSettings.STYLE.STYLE_IOS; - if (hasFinishTask) { + if (finishTaskCount>0) { MessageDialog.show(this, "提示", "后台正在处理已拍摄完成的任务,请稍后再退出当前界面"); + wantBack = true; return; } MessageDialog.show(this, "提示", "退出自动采集模式?", "是", "否").setOnOkButtonClickListener(new OnDialogButtonClickListener() {