java如何使用CameraX管理内存(分配问题)
我用CameraX内部片段开发应用程序。我注意到有很多分配,而且从未调用垃圾收集器。所以我从谷歌CameraX教程下载了示例应用程序,删除了所有不必要的内容。我用CameraX basic配置创建了空片段,只使用ImageCapture(无预览等)。我在三星Galaxy A32和小米Mi9T上进行了测试,结果如下:
测试:10分钟
三星Galaxy A32
小米Mi9T:
结果:小米有很多本地和本地的食物。它增长非常快,但Gargabe Collector负责,如果分配大于300K,则调用GC
三星-Native增长缓慢,分配增长迅速,而且从未调用GC。我也做了更长的测试(三星大约20分钟),GC仍然没有被调用
为什么会这样?是CameraX窃听器吗?使用CameraX时如何正确管理内存
我使用了一个片段(所需的其他代码与 https://developer.安卓.com/codelabs/camerax-getting-started#6
import 安卓.annotation.SuppressLint
import 安卓.os.Bundle
import 安卓.util.Log
import 安卓.view.LayoutInflater
import 安卓.view.View
import 安卓.view.ViewGroup
import 安卓x.camera.core.Camera
import 安卓x.camera.core.CameraSelector
import 安卓x.camera.core.ImageCapture
import 安卓x.camera.core.ImageProxy
import 安卓x.camera.lifecycle.ProcessCameraProvider
import 安卓x.core.content.ContextCompat
import 安卓x.fragment.app.Fragment
import 安卓x.navigation.Navigation
import com.安卓.example.cameraxbasic.MainActivity
import com.安卓.example.cameraxbasic.R
import com.安卓.example.cameraxbasic.databinding.FragmentCameraBinding
import java.io.File
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
class CameraFragment : Fragment() {
private var _fragmentCameraBinding: FragmentCameraBinding? = null
private val fragmentCameraBinding get() = _fragmentCameraBinding!!
private lateinit var outputDirectory: File
private var lensFacing: Int = CameraSelector.LENS_FACING_BACK
private var imageCapture: ImageCapture? = null
private var camera: Camera? = null
private var cameraProvider: ProcessCameraProvider? = null
/** Blocking camera operations are performed using this executor */
private lateinit var cameraExecutor: ExecutorService
override fun onResume() {
super.onResume()
// Make sure that all permissions are still present, since the
// user could have removed them while the app was in paused state.
if (!PermissionsFragment.hasPermissions(requireContext())) {
Navigation.findNavController(requireActivity(), R.id.fragment_container).navigate(
CameraFragmentDirections.actionCameraToPermissions()
)
}
}
override fun onDestroyView() {
_fragmentCameraBinding = null
super.onDestroyView()
// Shut down our background executor
cameraExecutor.shutdown()
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_fragmentCameraBinding = FragmentCameraBinding.inflate(inflater, container, false)
return fragmentCameraBinding.root
}
override fun onDestroy() {
super.onDestroy()
imageCapture?.takePicture(cameraExecutor, object : ImageCapture.OnImageCapturedCallback() {
override fun onCaptureSuccess(image: ImageProxy) {
super.onCaptureSuccess(image)
Log.d("IMAGE_CAPTURE", "Image captured SUCCESS")
}
})
}
@SuppressLint("MissingPermission")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Initialize our background executor
cameraExecutor = Executors.newSingleThreadExecutor()
outputDirectory = MainActivity.getOutputDirectory(requireContext())
setUpCamera()
}
/** Initialize CameraX, and prepare to bind the camera use cases */
private fun setUpCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
cameraProviderFuture.addListener({
// CameraProvider
cameraProvider = cameraProviderFuture.get()
// Select lensFacing depending on the available cameras
lensFacing = CameraSelector.LENS_FACING_BACK
// Build and bind the camera use cases
bindCameraUseCases()
}, ContextCompat.getMainExecutor(requireContext()))
}
/** Declare and bind preview, capture and analysis use cases */
private fun bindCameraUseCases() {
// CameraProvider
val cameraProvider = cameraProvider
?: throw IllegalStateException("Camera initialization failed.")
// CameraSelector
val cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
// ImageCapture
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Must unbind the use-cases before rebinding them
cameraProvider.unbindAll()
try {
camera = cameraProvider.bindToLifecycle(this, cameraSelector, imageCapture)
} catch (exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
}
companion object {
private const val TAG = "CameraXBasic"
}
}
共 (0) 个答案