优化时间延迟
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user