diff --git a/app/src/main/java/com/sw/inbound/activity/GoodsListActivity.kt b/app/src/main/java/com/sw/inbound/activity/GoodsListActivity.kt index 0143fcb..64e51a3 100644 --- a/app/src/main/java/com/sw/inbound/activity/GoodsListActivity.kt +++ b/app/src/main/java/com/sw/inbound/activity/GoodsListActivity.kt @@ -34,10 +34,9 @@ import com.sw.inbound.model.response.SearchGoodsInfo import com.sw.inbound.objbox.FoodModule import com.sw.inbound.sdk.SensorScaleUtils import com.sw.inbound.utils.BitmapCropper -import com.sw.inbound.utils.BitmapSaver import com.sw.inbound.utils.CameraUtils import com.sw.inbound.utils.ImageUtil -import com.sw.inbound.utils.ToastUtils +import com.sw.inbound.utils.PreciseDelayHandler import com.sw.inbound.utils.ext.dp import com.sw.inbound.utils.ext.gone import com.sw.inbound.utils.ext.hideKeyboard @@ -46,8 +45,6 @@ import com.sw.inbound.utils.ext.toJsonString import com.sw.inbound.utils.ext.toast import com.sw.inbound.viewmodel.ReceiptViewModel import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import timber.log.Timber import java.io.File @@ -68,7 +65,7 @@ abstract class GoodsListActivity : ComponentActivity() { public const val IS_NEW_RECEIPT = "isNewReceipt" const val PAGE_SIZE = 10 - private const val DELAY_TIME = 5 * 1000 + private const val DELAY_TIME: Long = 3 * 1000 } var isReceiptPage: Boolean = false @@ -147,7 +144,7 @@ abstract class GoodsListActivity : ComponentActivity() { } } cameraUtils.setPreviewController(previewView) - startTime = System.currentTimeMillis() + //startTime = System.currentTimeMillis() binding.root.postDelayed({ SensorScaleUtils.addWeightListener { runOnUiThread { @@ -202,7 +199,7 @@ abstract class GoodsListActivity : ComponentActivity() { recognizeFood() } - var startTime = 0L + //var startTime = 0L var isFirstRecognize = true private val takePhotoSuccessCallback: (Uri) -> Unit = { uri -> @@ -215,16 +212,17 @@ abstract class GoodsListActivity : ComponentActivity() { }.start() } + private val delayHandler by lazy { + PreciseDelayHandler() + } + fun delayRecognizeFood() { - if (abs(lastWeight) < 10) { - return - } - window.decorView.postDelayed( - { + if (abs(lastWeight) < 10) return + delayHandler.precisePostDelayed(DELAY_TIME) { + runOnUiThread { recognizeFood() - }, - DELAY_TIME.toLong() - ) + } + } } fun recognizeFood() { @@ -283,9 +281,6 @@ abstract class GoodsListActivity : ComponentActivity() { targetWidth = 1000, targetHeight = 1300, offsetX = 30, offsetY = 100 ) - if (bitmap.isRecycled.not()) { - bitmap.recycle() - } // val file = BitmapSaver.saveToAppFilesDir( // newBmp, // this, @@ -299,6 +294,9 @@ abstract class GoodsListActivity : ComponentActivity() { //foodList = foodList.map { it.split("WP")[0] } val foodList = FoodModule.getFoodScoreList(newBmp) + if (bitmap.isRecycled.not()) { + bitmap.recycle() + } if (newBmp.isRecycled.not()) { newBmp.recycle() } diff --git a/app/src/main/java/com/sw/inbound/dialog/GoodsRecognizeDialog.kt b/app/src/main/java/com/sw/inbound/dialog/GoodsRecognizeDialog.kt index 3cc2ca5..6562c51 100644 --- a/app/src/main/java/com/sw/inbound/dialog/GoodsRecognizeDialog.kt +++ b/app/src/main/java/com/sw/inbound/dialog/GoodsRecognizeDialog.kt @@ -61,7 +61,7 @@ class GoodsRecognizeDialog( goods = list[position] ) { activity?.addGoods(it) - activity?.startTime = System.currentTimeMillis() + //activity?.startTime = System.currentTimeMillis() dismiss() }.show() } @@ -79,7 +79,7 @@ class GoodsRecognizeDialog( binding.ivClose.setOnClickListener { dismiss() activity?.delayRecognizeFood() - activity?.startTime = System.currentTimeMillis() + //activity?.startTime = System.currentTimeMillis() } binding.btnManuallyFind.setOnClickListener { findGoods() diff --git a/app/src/main/java/com/sw/inbound/dialog/GoodsSearchDialog.kt b/app/src/main/java/com/sw/inbound/dialog/GoodsSearchDialog.kt index 750ea9a..a5fd225 100644 --- a/app/src/main/java/com/sw/inbound/dialog/GoodsSearchDialog.kt +++ b/app/src/main/java/com/sw/inbound/dialog/GoodsSearchDialog.kt @@ -69,7 +69,7 @@ class GoodsSearchDialog( goods = list[clickIndex] ) { activity?.addGoods(it) - activity?.startTime = System.currentTimeMillis() + //activity?.startTime = System.currentTimeMillis() activity?.goodsRecognizeDialog?.dismiss() dismiss() }.show() diff --git a/app/src/main/java/com/sw/inbound/sdk/SensorScaleUtils.kt b/app/src/main/java/com/sw/inbound/sdk/SensorScaleUtils.kt index 67c4789..f800a01 100644 --- a/app/src/main/java/com/sw/inbound/sdk/SensorScaleUtils.kt +++ b/app/src/main/java/com/sw/inbound/sdk/SensorScaleUtils.kt @@ -2,13 +2,11 @@ package com.sw.inbound.sdk import android.os.Handler import android.os.Looper -import com.sw.inbound.utils.MessageEvent import com.sw.inbound.utils.ThreadUtils import com.sw.inbound.utils.ToastUtils import com.wabon.wbintelligenthardwaresdk.api.SensorScale import com.wabon.wbintelligenthardwaresdk.api.SensorScale.OnScaleResult import kotlinx.coroutines.delay -import org.greenrobot.eventbus.EventBus import timber.log.Timber import kotlin.math.roundToInt diff --git a/app/src/main/java/com/sw/inbound/utils/ImageUtil.kt b/app/src/main/java/com/sw/inbound/utils/ImageUtil.kt index edd012c..c947880 100644 --- a/app/src/main/java/com/sw/inbound/utils/ImageUtil.kt +++ b/app/src/main/java/com/sw/inbound/utils/ImageUtil.kt @@ -9,10 +9,11 @@ object ImageUtil { fun uriToBitmap(context: Context, uri: Uri): Bitmap? { return try { val options = BitmapFactory.Options() - options.inSampleSize = 10; // 这会将图片的尺寸缩小到原来的1/2 + options.inSampleSize = 2; // 这会将图片的尺寸缩小到原来的1/2 + options.inJustDecodeBounds = false options.inPreferredConfig = Bitmap.Config.RGB_565 context.contentResolver.openInputStream(uri)?.use { stream -> - BitmapFactory.decodeStream(stream) + BitmapFactory.decodeStream(stream, null, options) } } catch (e: Exception) { e.printStackTrace() diff --git a/app/src/main/java/com/sw/inbound/utils/PreciseDelayHandler.kt b/app/src/main/java/com/sw/inbound/utils/PreciseDelayHandler.kt new file mode 100644 index 0000000..9741473 --- /dev/null +++ b/app/src/main/java/com/sw/inbound/utils/PreciseDelayHandler.kt @@ -0,0 +1,83 @@ +package com.sw.inbound.utils + +import android.os.Handler +import android.os.Looper +import android.os.SystemClock +import android.util.Log + +class PreciseDelayHandler { + val TAG = "PreciseDelayHandler" + + private val handler = Handler(Looper.getMainLooper()) + private var isRunning = false + private var endTime = 0L + + /** + * 精确延迟执行 + * @param delayMillis 总延迟时间(毫秒) + * @param runnable 要执行的任务 + */ + fun precisePostDelayed(delayMillis: Long, block:()-> Unit) { + isRunning = true + endTime = SystemClock.uptimeMillis() + delayMillis + + val ticker = object : Runnable { + override fun run() { + if (!isRunning) return + + val now = SystemClock.uptimeMillis() + val interval = now - endTime + if (interval >= 0) { + block() + isRunning = false + } else { + // 计算下一个整百毫秒时间点进行校准 + val next = now + (100 - now % 100) + handler.postAtTime(this, next) + } + } + } + handler.post(ticker) + } + + /** + * 精确循环执行 + * @param interval 执行间隔(毫秒) + * @param runnable 要执行的任务 + */ + fun preciseLoop(interval: Long, block:()-> Unit) { + isRunning = true + + val ticker = object : Runnable { + override fun run() { + if (!isRunning) return + + val startTime = SystemClock.uptimeMillis() + block() + + val elapsed = SystemClock.uptimeMillis() - startTime + val remainingDelay = interval - elapsed + + if (remainingDelay > 0) { + handler.postDelayed(this, remainingDelay) + } else { + handler.post(this) + } + } + } + handler.post(ticker) + } + + /** + * 取消所有延迟任务 + */ + fun cancelAll() { + isRunning = false + handler.removeCallbacksAndMessages(null) + } + + /** + * 获取是否正在运行 + */ + fun isRunning(): Boolean = isRunning +} \ No newline at end of file