How to fix Android Cannot get a dirty matrix error?(如何修复Android无法获得脏矩阵错误?)
问题描述
使用软键盘时输出未知错误
A/OpenGLRenderer: Cannot get a dirty matrix!
A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 42843 (Thread-12), pid 15445
为什么会发生这样的错误?你怎么解决它?
推荐答案
不要在工作线程上调用view#getLocationOnScreen或view#getMatrix,
View#getLocationOnScreen或View#getMatrix会将变量‘mPrimitiveFields.mMatrixOrPivotDirty’重置为False并进行检查,如果为True,则崩溃;
许多在主线程上运行的API(如View#setScaleX/setScaleY/setAlpha)会将变量‘mPrimitiveFields.mMatrixOrPivotDirty’设置为True
因此,如果‘View#getLocationOnScreen或View#getMatrix’在工作线程上运行,则可能并发修改变量‘mPrimitiveFields.mMatrixOrPivotDirty’并导致崩溃
如果您想要更详细的分析,请访问以下地址: https://www.jianshu.com/p/d6d3bb641198http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/jni/android_view_RenderNode.cpp http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/hwui/RenderProperties.h
查看#getLocationOnScreen或查看#getMatrix->; Android_view_RenderNode.cpp#android_view_RenderNode_getTransformMatrix->; static void android_view_RenderNode_getTransformMatrix(jlong renderNodePtr, jlong outMatrixPtr) {
RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
// call updateMatrix to reset 'mPrimitiveFields.mMatrixOrPivotDirty' to false
renderNode->mutateStagingProperties().updateMatrix();
// check 'mPrimitiveFields.mMatrixOrPivotDirty', if true then crash
const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix();
if (transformMatrix) {
*outMatrix = *transformMatrix;
} else {
outMatrix->setIdentity();
}
}
const SkMatrix* getTransformMatrix() const {
LOG_ALWAYS_FATAL_IF(mPrimitiveFields.mMatrixOrPivotDirty, "Cannot get a dirty matrix!");
return mComputedFields.mTransformMatrix;
}
这篇关于如何修复Android无法获得脏矩阵错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何修复Android无法获得脏矩阵错误?
基础教程推荐
- Android:getLastKnownLocation(LocationManager.NETWORK_PROVIDER 2022-01-01
- AdMob 广告未在模拟器中显示 2022-01-01
- 通过重定向链接在 Google Play 中打开应用 2022-01-01
- 如何从 logcat 中删除旧数据? 2022-01-01
- navigator.geolocation.getCurrentPosition 在 Android 浏览器上 2022-01-01
- iPhone - 获取给定地点/时区的当前日期和时间并将其与同一地点的另一个日期/时间进行比较的正确方法 2022-01-01
- Cocos2d iPhone 非矩形精灵触摸检测 2022-01-01
- libGDX 从精灵或纹理中获取像素颜色 2022-01-01
- iOS4 创建后台定时器 2022-01-01
- NSString intValue 不能用于检索电话号码 2022-01-01
