当前位置: 首页 > 知识库问答 >
问题:

如何修复“应用程序可能在其主线程上做了太多工作”(Android)[重复]

苗冯浩
2023-03-14

我正在开发一个android应用程序,在其中我可以进行高级图像处理,我使用自定义相机预览来捕获图像,但当我启动应用程序后检查logcat时,我发现来自Choreographer的消息跳过了440帧!应用程序可能在其主线程上做了太多工作。

我的日志如下

05-07 10:04:11.480: I/CameraPreview(28340): Orientation Changed
05-07 10:04:11.990: I/Choreographer(28340): Skipped 145 frames!  The application    may be doing too much work on its main thread.
05-07 10:04:15.620: I/Choreographer(28340): Skipped 212 frames!  The application      may be doing too much work on its main thread.
05-07 10:04:20.590: I/CameraPreview(28340): +++++++++++++++++++++++++++++++++++++++
05-07 10:04:20.590: I/CameraPreview(28340): starting recognition process
05-07 10:04:22.490: I/FaceDetector(28340): Number of faces found: 1
05-07 10:04:22.490: I/Value X(28340): 273
05-07 10:04:22.500: I/Value Y(28340): 106
05-07 10:04:22.500: I/Bitmap Width :(28340): 640
05-07 10:04:22.510: I/Bitmap Height :(28340): 480
05-07 10:04:22.520: I/CameraPreview(28340): Bitmap Size : 205 : 201
05-07 10:04:22.520: I/Face Recognition(28340):        ===========================================
05-07 10:04:22.520: I/Face Recognition(28340): recognizeFace (single face)
05-07 10:04:22.550: I/CameraPreview(28340): Previwe Stoped Face Detected....
05-07 10:04:22.550: I/CameraPreview(28340): Stopping preview in SurfaceDestroyed().
05-07 10:04:22.720: I/CameraPreview(28340): Total Recognition process took:       2.127638333
05-07 10:04:22.720: I/Choreographer(28340): Skipped 440 frames!  The application may    be doing too much work on its main thread.
  • 我在onFramePreview()方法中使用自定义相机预览来频繁捕获缓冲区图像,如果它包含“人脸”,则将其发送处理。
  • 当图像处理部分被执行时,它的帧被编排跳过,我没有得到预期的结果。
  • 我使用OpenCV进行图像处理

请帮我解决这个问题。我在StackOverflow中搜索了很多次,但没有得到正确的答案。

谢啦

共有3个答案

邓元白
2023-03-14

这就像在主线程中进行大量处理一样。您应该使用单独的线程或异步任务来处理或缓冲图像,然后可以更新ui。如果在doinBackground()中使用asychtask do background操作并在onPostExecute中更新ui,如果使用thread,则需要调用runOnUithread来更新ui

东门理
2023-03-14

图像处理部分是否在主线程上完成?如果是,则尝试在另一个线程中执行所有繁重的处理,处理完成后将其传递回主线程。更好的替代方法是使用AyncTask并在doInBackground()方法中执行图像处理。

请参阅以下教程:教程

乔伯寅
2023-03-14

使用更多线程,在后台线程上运行密集型进程,可以使用AsyncTask,也可以使用this。

    public Runnable NameOfRunnable = new Runnable()
    {
        @Override
        public void run()
        {
            while (true)
            {
            // TODO add code to refresh in background
                try
                {

                    Thread.sleep(1000);// sleeps 1 second
                    //Do Your process here.
                } catch (InterruptedException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
        }

    }
};

然后打电话

    NameOfRunnable.start();

    NameOfRunnable.run();

取决于你想用它做什么,无论是用户界面还是后台信息,再加上回调将有助于做你需要做的事情

 类似资料:
  • 我正在开发一个日历应用程序,并使用textview作为日历单元格,当我启动应用程序后检查logcat时,我发现来自Choreographer的消息“跳过了76帧!应用程序可能在其主线程上做了太多工作”。我知道我正在创建很多文本视图(120),但如何在不影响应用程序性能的情况下构建日历呢?是否有其他方法可以构建支持活动的日历?

  • 当我从缓存中获取大量数据(以视频的形式)时,应用程序会在长时间延迟后做出响应。 如何解决或修复它?

  • 我不知道为什么这个错误不断出现。这是我的全班同学; 这个代码段是一个单类应用程序,它应该打印写入文本字段的任何内容,但当我检查成对的设备时,它会给出标题错误。 有什么建议为什么??

  • 当我在emulator上启动应用程序时,我发现以下消息 我看到有很多类似的问题,但每个问题都有不同的解决方案。Tnx很多! 日志猫 搜索ictionary.java WordActivity.java 字典提供程序。Java语言 公共类DictionaryProvider扩展ContentProvider{String TAG="DictionaryProvider";

  • 我对Android非常陌生,在我的应用程序中,当我点击添加在碎片类上的按钮时,我在活动上添加了碎片,我在我的日志猫上得到警告,如下所示- 跳过91帧!应用程序可能在其主线程上做了太多工作。 请帮帮我我该怎么解决这个?

  • 您好,我正在开发一个android应用程序,当我尝试从我的应用程序发送电子邮件时,我会遇到这个错误。基于此链接,我在后台发送邮件而不使用意图 我的程序: 当我直接指定收件人的电子邮件地址时,应用程序工作正常。当我将其指定为存储收件人电子邮件地址的字符串数组时,问题就来了。 Logcat显示: 跳过222帧!应用程序可能在其主线程上做了太多工作。 谁能告诉我到底是什么问题?