Kal*_*leb 5 android textureview
我有一个基于Romain Guy的例子的TextureView,可以在这里找到.在Android 4.3和4.4上,经过几轮暂停和恢复应用程序后,应用程序崩溃,唯一的错误痕迹是LogCat中的致命信号11.我创建了一个测试应用程序,它使用Romain Guy的确切代码来查看它是否是我在代码中所做的事情,而Romain的代码也与致命信号11一起崩溃.
我已经确定,如果我使用Handler而不是Thread运行代码,它似乎不会使应用程序崩溃.Handler应该在主UI线程上运行(或者至少我相信它),这可能暗示它是一个线程问题.
我还确定在调用canvas.drawX(drawColor,drawBitmap,drawRect等等)期间发生了崩溃.锁定和解锁画布似乎不是问题.我怀疑线程正在被取消,而其他一些代码仍在使用画布,但由于缺少任何真正的异常并且崩溃相当不一致,我很难跟踪问题.
任何见解将不胜感激.
当TextureView失去可见性时(因为屏幕旋转,其他Activity出现在前面或者您按下主页按钮),它会使其无效SurfaceTexture.OnFrameAvailableListener(在GrepCode上)。看起来,当发生这种情况并且实例正在 C++ 代码上Canvas本机执行drawX()方法时,应用程序将崩溃,因为由于某种原因,包含该画布的内存在方法完成之前被清除。但是,由于Canvas.drawX()方法使用 Android 原生 C++ 代码,因此 C++ 不会抛出NullPointerException(如何捕获空指针异常?),因此 Java 异常处理系统在这种情况下毫无用处。
TextureView只要您drawX()多次调用方法或者在类上绘制一些复杂的内容,这个问题就会导致该类无法使用。Canvas方法或者在.
非常类似于线程和/或 C++ 代码方面的错误。我已经打开了一个报告此问题的问题:https://code.google.com/p/android/issues/detail?id=85380 ?id=85380 。
\n\n编辑:我找到了一种可靠的方法来避免在不再可见时调用drawX()方法,因此应用程序开始崩溃:中断正在绘制的线程并在每次调用该线程所在的任何方法之前检查打断了。事先被称为TextureViewCanvasdrawX()onPause()drawX()方法不会抛出任何错误。
mThread = new Thread() {\n @Override\n public void run() {\n Canvas canvas = mTV.lockCanvas();\n\n /** Draw your stuff on the canvas but check before every\n single drawX() call whether mThread has been interrupted **/\n Paint p = new Paint();\n p.setColor(Color.RED);\n for (int n=0; n<5000; ++n) {\n if (mThread.isInterrupted())\n break;\n canvas.drawCircle(0, 0, 300, p);\n }\n /** **/\n\n mTV.unlockCanvasAndPost(canvas);\n };\nmThread.start();\nRun Code Online (Sandbox Code Playgroud)\n\n然后在onPause()\xe2\x80\x93 上,就在调用之前的那一刻Canvas.drawX()应用程序\xe2\x80\x93 中断线程:
@Override\npublic void onPause() {\n super.onPause();\n if (mThread != null) {\n mThread.interrupt();\n mThread = null;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n还将相同的代码添加到onStop()和 到onDestroy()。我还尝试TextureView.onVisibilityChanged()通过重写该方法来中断线程来使用该方法。但是这个方法在调用后几乎 500 毫秒才被调用,onPause()此时为时已晚,并且drawX()调用开始导致应用程序崩溃。
| 归档时间: |
|
| 查看次数: |
1177 次 |
| 最近记录: |