我试图让一个非常简单的应用程序运行列表google Task。 我有一个SQLite本地数据库我想定期与Google的服务器同步/尝试同步。
我在考虑简单地运行一个简单的后台线程,以便它可以在所有设备上轻松工作。
问题出现在PCL项目中创建后台线程(Xamarin.Forms) 我似乎无法找到合适的方法。
目前我只是运行第二个线程:
private bool Sync() { //Does stuffs }
private void SynchronizeData()
{
// Repeats sync process every 35s
Device.StartTimer (new TimeSpan (0, 0, 35), Sync);
}
// Is called pretty much when app starts.
private void StartSynchronizationThread()
{
Task.Factory.StartNew(SynchronizeData,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
}
虽然考虑到操作计数真的很低(但最糟糕的情况是测试目的,它的阻塞时间不到一秒),它应该不是一个很大的问题。当线程应该是什么时,我的应用程序大量冻结跑了第一个。 (计时器首次到期) 冻结持续了一段时间......
一旦它被摧毁,我可以永远留在应用程序上,没有一个问题。我注意到以下情况很晚才出现:
[技术] 螺纹[2,TID = 2532,WaitingInMainSignalCatcherLoop,螺纹* = 0xee170800,同行= 0x12c00080,"信号 Catcher"]:对信号3做出反应[艺术]写入堆栈跟踪 ' /data/anr/traces.txt' [艺术]写了堆栈跟踪 ' /data/anr/traces.txt' [艺术] 螺纹[2,TID = 2532,WaitingInMainSignalCatcherLoop,螺纹* = 0xee170800,同行= 0x12c00080,"信号 Catcher"]:对信号3做出反应[艺术]写入堆栈跟踪 ' /data/anr/traces.txt'
Traces并没有真正给我更多的信息...... 但它可能与它有关。
任何人都有关于此事的暗示?包,代码示例还是其他什么? 希望我错过了一些重要的事情;
感谢。
答案 0 :(得分:1)
在实际设备上像魅力一样工作,问题与模拟器相关联。 (但是Haven没有找到解决方法)
答案 1 :(得分:0)
在Xamarin表单中,您必须本地执行适当的后台任务,如下所述: Backgrounding with Xamarin Forms
要原生,您需要使用Xamarin MessagingCenter来回发送适当的后台任务(取决于您尝试实现的目标)。例如,在Android中定义服务:
[Service]
class YourService : Service
{
public override IBinder OnBind(Intent intent)
{
return null;
}
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
// Do your thang!
}
}