首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复“应用程序在其主线程上可能做了太多的工作”(Android)

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

Stack Overflow用户
提问于 2014-05-07 04:59:19
回答 3查看 20.9K关注 0票数 1

我正在开发一个android应用程序,在这个应用程序中我可以进行高级别的图像处理,并且我使用自定义的摄像机预览来捕获图像,但是当我在启动应用程序后检查logcat时,我发现了来自编舞者Skipped 440 frames! The application may be doing too much work on its main thread的这条消息。

我的日志是低沉的

代码语言:javascript
复制
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上搜索了很多次,但没有得到正确的答案。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-07 05:05:41

使用更多的线程,在后台线程上运行密集进程,要么使用AsyncTask,要么使用它。

代码语言:javascript
复制
    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();
            }
        }

    }
};

然后打电话

代码语言:javascript
复制
    NameOfRunnable.start();

代码语言:javascript
复制
    NameOfRunnable.run();

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

票数 4
EN

Stack Overflow用户

发布于 2014-05-07 05:02:53

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

请参阅以下教程:教程

票数 0
EN

Stack Overflow用户

发布于 2014-05-07 05:05:11

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23509060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档