优化时间延迟

This commit is contained in:
2025-11-17 18:38:32 +08:00
parent d10879ca29
commit 0485716513
6 changed files with 105 additions and 25 deletions
@@ -34,10 +34,9 @@ import com.sw.inbound.model.response.SearchGoodsInfo
import com.sw.inbound.objbox.FoodModule import com.sw.inbound.objbox.FoodModule
import com.sw.inbound.sdk.SensorScaleUtils import com.sw.inbound.sdk.SensorScaleUtils
import com.sw.inbound.utils.BitmapCropper import com.sw.inbound.utils.BitmapCropper
import com.sw.inbound.utils.BitmapSaver
import com.sw.inbound.utils.CameraUtils import com.sw.inbound.utils.CameraUtils
import com.sw.inbound.utils.ImageUtil 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.dp
import com.sw.inbound.utils.ext.gone import com.sw.inbound.utils.ext.gone
import com.sw.inbound.utils.ext.hideKeyboard 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.utils.ext.toast
import com.sw.inbound.viewmodel.ReceiptViewModel import com.sw.inbound.viewmodel.ReceiptViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import timber.log.Timber import timber.log.Timber
import java.io.File import java.io.File
@@ -68,7 +65,7 @@ abstract class GoodsListActivity : ComponentActivity() {
public const val IS_NEW_RECEIPT = "isNewReceipt" public const val IS_NEW_RECEIPT = "isNewReceipt"
const val PAGE_SIZE = 10 const val PAGE_SIZE = 10
private const val DELAY_TIME = 5 * 1000 private const val DELAY_TIME: Long = 3 * 1000
} }
var isReceiptPage: Boolean = false var isReceiptPage: Boolean = false
@@ -147,7 +144,7 @@ abstract class GoodsListActivity : ComponentActivity() {
} }
} }
cameraUtils.setPreviewController(previewView) cameraUtils.setPreviewController(previewView)
startTime = System.currentTimeMillis() //startTime = System.currentTimeMillis()
binding.root.postDelayed({ binding.root.postDelayed({
SensorScaleUtils.addWeightListener { SensorScaleUtils.addWeightListener {
runOnUiThread { runOnUiThread {
@@ -202,7 +199,7 @@ abstract class GoodsListActivity : ComponentActivity() {
recognizeFood() recognizeFood()
} }
var startTime = 0L //var startTime = 0L
var isFirstRecognize = true var isFirstRecognize = true
private val takePhotoSuccessCallback: (Uri) -> Unit = { uri -> private val takePhotoSuccessCallback: (Uri) -> Unit = { uri ->
@@ -215,16 +212,17 @@ abstract class GoodsListActivity : ComponentActivity() {
}.start() }.start()
} }
private val delayHandler by lazy {
PreciseDelayHandler()
}
fun delayRecognizeFood() { fun delayRecognizeFood() {
if (abs(lastWeight) < 10) { if (abs(lastWeight) < 10) return
return delayHandler.precisePostDelayed(DELAY_TIME) {
} runOnUiThread {
window.decorView.postDelayed(
{
recognizeFood() recognizeFood()
}, }
DELAY_TIME.toLong() }
)
} }
fun recognizeFood() { fun recognizeFood() {
@@ -283,9 +281,6 @@ abstract class GoodsListActivity : ComponentActivity() {
targetWidth = 1000, targetHeight = 1300, targetWidth = 1000, targetHeight = 1300,
offsetX = 30, offsetY = 100 offsetX = 30, offsetY = 100
) )
if (bitmap.isRecycled.not()) {
bitmap.recycle()
}
// val file = BitmapSaver.saveToAppFilesDir( // val file = BitmapSaver.saveToAppFilesDir(
// newBmp, // newBmp,
// this, // this,
@@ -299,6 +294,9 @@ abstract class GoodsListActivity : ComponentActivity() {
//foodList = foodList.map { it.split("WP")[0] } //foodList = foodList.map { it.split("WP")[0] }
val foodList = FoodModule.getFoodScoreList(newBmp) val foodList = FoodModule.getFoodScoreList(newBmp)
if (bitmap.isRecycled.not()) {
bitmap.recycle()
}
if (newBmp.isRecycled.not()) { if (newBmp.isRecycled.not()) {
newBmp.recycle() newBmp.recycle()
} }
@@ -61,7 +61,7 @@ class GoodsRecognizeDialog(
goods = list[position] goods = list[position]
) { ) {
activity?.addGoods(it) activity?.addGoods(it)
activity?.startTime = System.currentTimeMillis() //activity?.startTime = System.currentTimeMillis()
dismiss() dismiss()
}.show() }.show()
} }
@@ -79,7 +79,7 @@ class GoodsRecognizeDialog(
binding.ivClose.setOnClickListener { binding.ivClose.setOnClickListener {
dismiss() dismiss()
activity?.delayRecognizeFood() activity?.delayRecognizeFood()
activity?.startTime = System.currentTimeMillis() //activity?.startTime = System.currentTimeMillis()
} }
binding.btnManuallyFind.setOnClickListener { binding.btnManuallyFind.setOnClickListener {
findGoods() findGoods()
@@ -69,7 +69,7 @@ class GoodsSearchDialog(
goods = list[clickIndex] goods = list[clickIndex]
) { ) {
activity?.addGoods(it) activity?.addGoods(it)
activity?.startTime = System.currentTimeMillis() //activity?.startTime = System.currentTimeMillis()
activity?.goodsRecognizeDialog?.dismiss() activity?.goodsRecognizeDialog?.dismiss()
dismiss() dismiss()
}.show() }.show()
@@ -2,13 +2,11 @@ package com.sw.inbound.sdk
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import com.sw.inbound.utils.MessageEvent
import com.sw.inbound.utils.ThreadUtils import com.sw.inbound.utils.ThreadUtils
import com.sw.inbound.utils.ToastUtils import com.sw.inbound.utils.ToastUtils
import com.wabon.wbintelligenthardwaresdk.api.SensorScale import com.wabon.wbintelligenthardwaresdk.api.SensorScale
import com.wabon.wbintelligenthardwaresdk.api.SensorScale.OnScaleResult import com.wabon.wbintelligenthardwaresdk.api.SensorScale.OnScaleResult
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import org.greenrobot.eventbus.EventBus
import timber.log.Timber import timber.log.Timber
import kotlin.math.roundToInt import kotlin.math.roundToInt
@@ -9,10 +9,11 @@ object ImageUtil {
fun uriToBitmap(context: Context, uri: Uri): Bitmap? { fun uriToBitmap(context: Context, uri: Uri): Bitmap? {
return try { return try {
val options = BitmapFactory.Options() val options = BitmapFactory.Options()
options.inSampleSize = 10; // 这会将图片的尺寸缩小到原来的1/2 options.inSampleSize = 2; // 这会将图片的尺寸缩小到原来的1/2
options.inJustDecodeBounds = false
options.inPreferredConfig = Bitmap.Config.RGB_565 options.inPreferredConfig = Bitmap.Config.RGB_565
context.contentResolver.openInputStream(uri)?.use { stream -> context.contentResolver.openInputStream(uri)?.use { stream ->
BitmapFactory.decodeStream(stream) BitmapFactory.decodeStream(stream, null, options)
} }
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
@@ -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
}