android - 某些设备上 Surface.nativeLockCanvas 上的 ANR

标签 android surfaceview surfaceholder

我需要在来自加速度计的事件上绘制 SurfaceView。 我创建回调以检查该表面是否准备就绪。

overlaySurfaceView = (SurfaceView) findViewById(R.id.overlay_surface);
overlaySurfaceView.setZOrderMediaOverlay(true);
overlayHolder = overlaySurfaceView.getHolder();
overlayHolder.setFormat(PixelFormat.TRANSPARENT);
overlayHolder.addCallback(new SurfaceHolder.Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        overlayReady = true;
        Log.d(TAG, "SET overlayReady = true");
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        overlayReady = false;
        Log.d(TAG, "SET overlayReady = false");
    }
});

在传感器监听器中我锁定 Canvas 并绘制一些东西

private final SensorEventListener orientationListener = new SensorEventListener() {
    @Override
    public void onSensorChanged(SensorEvent event) {

        Log.d(TAG, "onSensorChanged: overlayReady = " + overlayReady);

        if (!overlayReady)
            return;

        if (overlayHolder == null || overlayHolder.isCreating() || !overlayHolder.getSurface().isValid()) {
            return;
        }

        Canvas canvas = overlayHolder.lockCanvas();
        if (canvas == null) {
            return;
        }

        canvas.drawColor(0, PorterDuff.Mode.CLEAR);
        // Some drawing
        overlayHolder.unlockCanvasAndPost(canvas);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
};

但是从一个使用 Transformer Pad (TF103CG) (K018) 的客户端,我得到了描述 Waiting 的 ANR,因为触摸的窗口还没有完成处理之前传递给它的输入事件。

----- pid 10710 at 2016-03-02 17:25:43 -----
Cmd line: com.####.#####
JNI: CheckJNI is off; workarounds are off; pins=0; globals=295
DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)
"main" prio=5 tid=1 NATIVE
  | group="main" sCount=1 dsCount=0 obj=0x430f7340 self=0x430e4620
  | sysTid=10710 nice=0 sched=0/0 cgrp=apps handle=1073954880
  | state=S schedstat=( 11049431919 2136334229 17921 ) utm=902 stm=202 core=1
  (native backtrace unavailable)
  at android.view.Surface.nativeLockCanvas(Native Method)
  at android.view.Surface.lockCanvas(Surface.java:243)
  at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:822)
  at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:790)
  at com.####.#####.CustomCameraActivity$6.onSensorChanged(CustomCameraActivity.java:342)
  at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:418)

ANR日志全文here.

哪里会出问题?

最佳答案

作为解决方案,我创建了另一个线程并将代码从 onSensorChanged 移动到它。 在一个线程中,我在 Canvas 上绘制并休眠 100 毫秒。在 onSensorChanged 中,我现在只保存传感器值。

关于android - 某些设备上 Surface.nativeLockCanvas 上的 ANR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35935152/

相关文章:

android - BitmapFactory.decodeFile();

Android Monitor 显示我的应用程序内存不断增加

android - SurfaceView onMeasure() 没有调用setMeasuredDimension() 设置测量维度

android - 使用自动对焦拍照失败

java - Android - IntentReceiver 泄漏/泄漏/泄漏

java - 字符串太长时被截断

android - UIAutomator 测试的安全异常

Android:SurfaceView 正在阻止抽屉导航

java - 安卓相机 : app passed NULL surface

java - 将元素添加到列表时 Android 应用程序崩溃