有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用CameraX管理内存(分配问题)

我用CameraX内部片段开发应用程序。我注意到有很多分配,而且从未调用垃圾收集器。所以我从谷歌CameraX教程下载了示例应用程序,删除了所有不必要的内容。我用CameraX basic配置创建了空片段,只使用ImageCapture(无预览等)。我在三星Galaxy A32和小米Mi9T上进行了测试,结果如下:

测试:10分钟

三星Galaxy A32

enter image description here

小米Mi9T:

enter image description here

结果:小米有很多本地和本地的食物。它增长非常快,但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) 个答案