gpt4 book ai didi

android - 服务启动几秒钟后获取 WaitingInMainSignalCatcherLoop 信号捕捉器

转载 作者:行者123 更新时间:2023-11-29 02:31:24 27 4
gpt4 key购买 nike

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

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

我正在使用 android 8.0.0 调试 Oneplus 3T。使用sqlite-net ORM将传感器数据直接写入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);
}
}
}

提前致谢;)

最佳答案

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

 _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 让我想到了线程!

关于android - 服务启动几秒钟后获取 WaitingInMainSignalCatcherLoop 信号捕捉器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49458124/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com