服务启动几秒后获取WaitingInMainSignalCatcherLoop信号捕获器

时间:2018-03-23 20:49:54

标签: android xamarin xamarin.android

我正在创建一个收集sensordata的Xamarin应用程序,以便我可以使用机器学习进行实验。该应用程序在后台使用intentservice ..但几秒钟后,我收到以下错误:

03-23 21:31:14.772 I / zygote64(18051):线程[3,tid = 18057,WaitingInMainSignalCatcherLoop,Thread * = 0x7dabcc0400,peer = 0x13fc0088,“Signal Catcher”]:对信号3作出反应 03-23 21:31:14.772 I / zygote64(18051): 03-23 21:31:14.772 E / zygote64(18051):#HandleSigQuit#DumpForSigQuit#before#pid = 18051 03-23 21:31:14.879 E / zygote64(18051):#HandleSigQuit #DumpForSigQuit#after#pid = 18051 03-23 21:31:14.883 I / zygote64(18051):将堆栈跟踪写入'/data/anr/traces.txt'

我在使用Android 8.0.0的Oneplus 3T上进行调试。 使用sqlite-net ORM将sensordata直接写入sqlite数据库。

我已经尝试了9个小时的调试..但我无法修复错误。 当我评论出服务时......它没有给我任何错误。

这就是我的服务的样子:

using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Hardware;
using Tabi.DataStorage;
using Tabi.DataObjects;

namespace Tabi.Droid.CollectionService
{
    [Service]
    public class SensorService : IntentService, ISensorEventListener
    {
        private readonly ISensorRepository<Accelerometer> _accelerometerRepository;
        private readonly ISensorRepository<Gyroscope> _gyroscopeRepository;
        private readonly ISensorRepository<Magnetometer> _magnetometerRepository;
        private readonly ISensorRepository<LinearAcceleration> _linearAccelerationRepository;
        private readonly ISensorRepository<Orientation> _orientationRepository;
        private readonly ISensorRepository<Quaternion> _quaternionRepository;
        private readonly ISensorRepository<Gravity> _gravityRepository;


        public SensorService()
        {
            _accelerometerRepository = App.RepoManager.AccelerometerRepository;
            _gyroscopeRepository = App.RepoManager.GyroscopeRepository;
            _magnetometerRepository = App.RepoManager.MagnetometerRepository;
            _linearAccelerationRepository = App.RepoManager.LinearAccelerationRepository;
            _orientationRepository = App.RepoManager.OrientationRepository;
            _quaternionRepository = App.RepoManager.QuaternionRepository;
            _gravityRepository = App.RepoManager.GravityRepository;
        }


        public void OnAccuracyChanged(Sensor sensor, [GeneratedEnum] SensorStatus accuracy)
        {

        }

        public void OnSensorChanged(SensorEvent e)
        {
            //start gathering data and push to SqliteDB
            switch (e.Sensor.Type)
            {
                case SensorType.Accelerometer:
                     _accelerometerRepository.Add(new Accelerometer()
                    {
                        Timestamp = DateTimeOffset.Now,
                        X = e.Values[0],
                        Y = e.Values[1],
                        Z = e.Values[2],
                    });
                    break;

                case SensorType.Gyroscope:
                    _gyroscopeRepository.Add(new Gyroscope()
                    {
                        Timestamp = DateTimeOffset.Now,
                        X = e.Values[0],
                        Y = e.Values[1],
                        Z = e.Values[2],
                    });
                    break;

                case SensorType.MagneticField:
                    _magnetometerRepository.Add(new Magnetometer()
                    {
                        Timestamp = DateTimeOffset.Now,
                        X = e.Values[0],
                        Y = e.Values[1],
                        Z = e.Values[2],
                    });
                    break;

                case SensorType.Orientation:
                    _orientationRepository.Add(new Orientation()
                    {
                        Timestamp = DateTimeOffset.Now,
                        X = e.Values[0],
                        Y = e.Values[1],
                        Z = e.Values[2]
                    });
                    break;

                case SensorType.Gravity:
                    _gravityRepository.Add(new Gravity()
                    {
                        Timestamp = DateTimeOffset.Now,
                        X = e.Values[0],
                        Y = e.Values[1],
                        Z = e.Values[2]
                    });
                    break;

                case SensorType.LinearAcceleration:
                    _linearAccelerationRepository.Add(new LinearAcceleration()
                    {
                        Timestamp = DateTimeOffset.Now,
                        X = e.Values[0],
                        Y = e.Values[1],
                        Z = e.Values[2]
                    });
                    break;

                case SensorType.RotationVector:
                    _quaternionRepository.Add(new Quaternion
                    {
                        Timestamp = DateTimeOffset.Now,
                        X = e.Values[0],
                        Y = e.Values[1],
                        Z = e.Values[2],
                        W = e.Values[3]
                    });
                    break;

                default:
                    break;
            }
        }

        protected override void OnHandleIntent(Intent intent)
        {
            var sensorManager = (SensorManager)Application.Context.GetSystemService(Context.SensorService);

            Sensor accelerometer = sensorManager.GetDefaultSensor(SensorType.Accelerometer);
            sensorManager.RegisterListener(this, accelerometer, SensorDelay.Normal);

            Sensor gyroscope = sensorManager.GetDefaultSensor(SensorType.Gyroscope);
            sensorManager.RegisterListener(this, gyroscope, SensorDelay.Normal);

            Sensor magnetometer = sensorManager.GetDefaultSensor(SensorType.MagneticField);
            sensorManager.RegisterListener(this, magnetometer, SensorDelay.Normal);

            //sensor fusion
            //linear acceleration
            Sensor linearAcceleration = sensorManager.GetDefaultSensor(SensorType.LinearAcceleration);
            sensorManager.RegisterListener(this, linearAcceleration, SensorDelay.Normal);

            //gravity
            Sensor gravity = sensorManager.GetDefaultSensor(SensorType.Gravity);
            sensorManager.RegisterListener(this, gravity, SensorDelay.Normal);

            //pitch yaw roll / orientation
            Sensor orientation = sensorManager.GetDefaultSensor(SensorType.Orientation);
            sensorManager.RegisterListener(this, orientation, SensorDelay.Normal);

            //quaternion
            Sensor rotationVector = sensorManager.GetDefaultSensor(SensorType.RotationVector);
            sensorManager.RegisterListener(this, rotationVector, SensorDelay.Normal);
        }
    }
}

提前致谢;)

1 个答案:

答案 0 :(得分:0)

经过12个多小时的调试,我已经解决了这个问题! 我已将服务从intentservice更改为普通服务。 感知的其余部分是在第二次服务中获得的。 似乎像这样的代码块是一个瓶颈:

 _magnetometerRepository.Add(new Magnetometer()
                        {
                            Timestamp = DateTimeOffset.Now,
                            X = e.Values[0],
                            Y = e.Values[1],
                            Z = e.Values[2],
                        });

这是我的最终结果:

using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Hardware;
using Tabi.DataStorage;
using Tabi.DataObjects;
using System.Threading.Tasks;

namespace Tabi.Droid.CollectionService
{
    [Service]
    public class SensorService : Service, ISensorEventListener
    {
        private readonly ISensorRepository<Accelerometer> _accelerometerRepository;
        private readonly ISensorRepository<Gyroscope> _gyroscopeRepository;
        private readonly ISensorRepository<Magnetometer> _magnetometerRepository;

        private SensorServiceBinder _binder;

        public SensorService()
        {
            _accelerometerRepository = App.RepoManager.AccelerometerRepository;
            _gyroscopeRepository = App.RepoManager.GyroscopeRepository;
            _magnetometerRepository = App.RepoManager.MagnetometerRepository;
        }


        public override IBinder OnBind(Intent intent)
        {
            // service binder is used to communicate with the service
            _binder = new SensorServiceBinder(this);
            return _binder;
        }

        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            //!!!possibly needed for android 8+
            // maybe convert it into foreground service and uncomment code below
            //Notification.Builder builder = new Notification.Builder(Application.Context, "com.tabi.sensor");
            //builder.SetContentTitle("sensor");
            //builder.SetContentText("you are being watched -.-");
            //builder.SetAutoCancel(true);

            //Notification notification = builder.Build();
            //StartForeground(1, notification);


            //register sensors for listening
            Task.Run(() =>
            {
                var sensorManager = (SensorManager)Application.Context.GetSystemService(Context.SensorService);

                Sensor accelerometer = sensorManager.GetDefaultSensor(SensorType.Accelerometer);
                sensorManager.RegisterListener(this, accelerometer, SensorDelay.Normal);

                Sensor gyroscope = sensorManager.GetDefaultSensor(SensorType.Gyroscope);
                sensorManager.RegisterListener(this, gyroscope, SensorDelay.Normal);

                Sensor magnetometer = sensorManager.GetDefaultSensor(SensorType.MagneticField);
                sensorManager.RegisterListener(this, magnetometer, SensorDelay.Normal);
            });

            return StartCommandResult.Sticky;
        }

        public void OnAccuracyChanged(Sensor sensor, [GeneratedEnum] SensorStatus accuracy)
        {

        }

        public void OnSensorChanged(SensorEvent e)
        {
            //start gathering data and push to SqliteDB
            switch (e.Sensor.Type)
            {
                case SensorType.Accelerometer:
                    Task.Run(() =>
                    {
                        _accelerometerRepository.Add(new Accelerometer()
                        {
                            Timestamp = DateTimeOffset.Now,
                            X = e.Values[0],
                            Y = e.Values[1],
                            Z = e.Values[2],
                        });
                        Console.WriteLine("accelerometer: X:" + e.Values[0] + " Y" + e.Values[1] + " Z:" + e.Values[2]);
                    });
                    break;

                case SensorType.Gyroscope:
                    Task.Run(() =>
                    {
                        _gyroscopeRepository.Add(new Gyroscope()
                        {
                            Timestamp = DateTimeOffset.Now,
                            X = e.Values[0],
                            Y = e.Values[1],
                            Z = e.Values[2],
                        });
                    });
                    Console.WriteLine("Gyroscope: X:" + e.Values[0] + " Y" + e.Values[1] + " Z:" + e.Values[2]);
                    break;

                case SensorType.MagneticField:
                    Task.Run(() =>
                    {
                        _magnetometerRepository.Add(new Magnetometer()
                        {
                            Timestamp = DateTimeOffset.Now,
                            X = e.Values[0],
                            Y = e.Values[1],
                            Z = e.Values[2],
                        });
                    });
                    Console.WriteLine("magnetometer: X:" + e.Values[0] + " Y" + e.Values[1] + " Z:" + e.Values[2]);
                    break;

                default:
                    break;
            }
        }
    }
}

感谢SushiHangover为我提供线程化的想法!