我有两部搭载Android 5.0.2的手机,它们都安装了最新的Radius Beacon应用程序:Locate Beacon,同时,我打开了2个IBeacon发送器,可以看到RSSI 在两款手机中随着应用程序不断变化.
但是当我尝试编写一些示例代码来模拟上述情况时,我发现ble扫描回调总是在调用2或3次后停止调用,我最初怀疑'Locate Beacon'可能使用不同的方式,所以我尝试了2种API,一个用于旧的4.4,另一个是在android 5中引入的新方式,但两者都是相同的行为(但都在android 5上运行).
4.4一:
public class MainActivity extends Activity {
private BluetoothAdapter mBluetoothAdapter;
private static final String LOG_TAG = "BleCollector";
private TextView calledTimesTextView = null;
private int calledTimes = 0;
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
calledTimes++;
runOnUiThread(new Runnable() {
@Override
public void run() {
calledTimesTextView.setText(Integer.toString(calledTimes));
}
});
Log.e(LOG_TAG, "in onScanResult, " …Run Code Online (Sandbox Code Playgroud) android bluetooth-lowenergy indoor-positioning-system ibeacon
[Edit0] 人们提供了一些很好的建议来优化实例创建(通过使用数组缓冲区),从而降低 GC 周期,但也请解释为什么只有这个线程标记为“禁用抢先式 GC”,这是我的情况僵局?
最近我正在对我们用 .NET 3.5 编写的应用程序(在 Windows XP 上)进行一些测试,我注意到在某些情况下应用程序性能非常糟糕,TaskManager 中显示的内存是正常情况的数倍,但没有挂起。我做了一个内存转储并简单地放入Microsoft DebugDiag 工具中,这对于不擅长 WinDbg 的人来说是一个很好的工具。
我知道应用程序中肯定存在一些内存泄漏问题,但这里的问题是关于 GC。
生成的报告中有一行:
线程 6触发了垃圾回收。垃圾收集器线程直到禁用了抢占式 GC的线程完成执行后才会开始工作 。以下线程禁用了抢先式 GC:线程 6
从描述中,我将其理解为GC的死锁和“禁用抢先 GC ”线程,(但为什么不挂起??)然后我想知道为什么该线程标记为“禁用抢先 GC ”。
然后我检查了Thread 6的调用堆栈并找出源代码,它是一个由以下人员显式创建的线程:
//Create the thread.
thread = new Thread(Execute) { Priority = ThreadPriority.Lowest };
thread.Start();
Run Code Online (Sandbox Code Playgroud)
这个线程所做的是线程安全地从队列中取出一个日志文本行,并刷新到一个磁盘文件:
// Wait for an event from the thread that en-queue
waitEvent.WaitOne();
if (!disposed)
{
// Clear the …Run Code Online (Sandbox Code Playgroud) 我有一个ASP.NET CORE MVC (.NET CORE 3.1)应用程序在 Windows 中的Kestrel上运行良好,现在我想知道是否可以通过 Xamarin 将其迁移到 Android?
此举的目的是降低Android设备的成本。
我注意到:Run ASP.NET Core 3.0 apps with MonoVM 但似乎没有细节?
我错误地删除了路径projectName/appName/migrations下的所有.py文件,它包括:
0001_initial.py
0011_auto_20150918_0723.py
0002_auto_20150819_1301.py
...
现在,即使我更新了Model文件,并运行该命令python manage.py makemigrations,它始终会在未检测到更改的情况下提示.
我怎样才能恢复一切?
在我的测试代码中我有一个奇怪的行为,代码很简单,创建了一堆具有相同模式的Timers:在所有回调中添加一个Thread.Sleep.然后几乎同时启动计时器,然后我可以看到一些计时器的回调被延迟.
public class StrangTimerTesting
{
public int callback_EnteredTimes;
// for avoid timers get GCed.
private List<System.Timers.Timer> timerContainer = new List<System.Timers.Timer>();
public void Go()
{
for (var i = 0; i < 5; i++)
{
var displayTimer = new System.Timers.Timer(1000);
displayTimer.Elapsed += (a, b) =>
{
Interlocked.Increment(ref this.callback_EnteredTimes);
var initalTime = DateTime.Now.ToString("HH:mm:ss.ffff");
Console.WriteLine("entered times: " + callback_EnteredTimes + ", intial@" + initalTime);
displayTimer.Stop();
// why this Sleep cause some callback delayed to be called????
Thread.Sleep(6000);
};
displayTimer.Start(); …Run Code Online (Sandbox Code Playgroud) 我已经订阅了一个推送内容的频率很高的Observable,这些内容来自网络I/O,所以每次推送都来自不同的线程,然后我有一些观察者可能会尝试获取一些内容然后快速取消订阅以确保有没有其他内容传入,所以代码示例如下:
IDisposable dsp = null;
dsp = TargetObservable.Subscribe((incomingContent) =>
{
if (incomingContent == "something")
{
myList.Add(incomingContent);
dsp.Dispose();
}
else
{
otherList.Add(incomingContent);
}
});
Run Code Online (Sandbox Code Playgroud)
现在,OnNext显然不是线程安全的,意味着当Observer在调用Dispose()之前得到"东西"时,其他内容可能仍然传入并添加到'otherList',即使我放了一个'lock(.. .)'为整个'onNext(...)'.
这不是我们想要的,所以任何想法都要避免这种情况?我可以考虑的一种方法是修改Observable逐个推送内容(通过使用'lock'),然后性能必须伤害很多.谢谢.
我的项目中有很多代码,如Hit和静音,通过这种方式使用Reactive扩展:
IDisposable dsp = null;
dsp = TargetObservable.Subscribe((incomingContent) =>
{
if (incomingContent == "something")
{
myList.Add(incomingContent);
dsp.Dispose();
}
});
Run Code Online (Sandbox Code Playgroud)
首先,我担心线程的安全性,因为我的Observable非常繁忙并且一直有大量内容推送,但后来,我被告知我应该结合ObserveOn(thread)保证线程安全,我完全同意,所以让我们忘记了线程安全的事情.
在这里,我想知道:
Take(count)'TakeWhile(预测)'?OnComplete()被调用,Dispose()将在内部调用,对吗?然后Observer和Observable之间的引用关系将中断(因为我的observable是一个长寿命的静态实例,引用会导致内存泄漏).