バックグラウンドAPIコール中に閉じるXamarinフォームアプリがあります。私はこのプロジェクトにシンクコードをあまり書きませんでしたが、私はそれをトラブルシューティングしたままにしています。ここでは、コードが何をしているかの概要は次のとおりです。XamarinのフォームAbstractThreadedSyncAdapterがエラーまたは例外なしで閉じる
は- API呼び出しが消灯し、JSON文字列が正しくC#のオブジェクトのリストにシリアライズされ、正常
- 返されます。
- オブジェクトは、アプリケーションで気になるプロパティのみを含むローカルクラスにマップするメソッドに渡されます。
- このマッピングの後、これらのオブジェクトをsql liteデータベースに挿入します。
オブジェクトのリストをループしてマッピングしている間、ある時点で、アプリは何らかの例外をスローすることなく閉じます。私は、クラッシュの原因となっているデータに関連するものがあるかどうかを調べるためにオブジェクトを注文しようとしましたが、パターンが検出されません。 15、20、27番目のオブジェクトの後でクラッシュすることがあるので、データの問題とは関係しません。ここのコードはかなり基本的です:foreachループと、あるクラスから別のクラスにプロパティを割り当てる基本メソッドです。コードに問題があった場合、例外がスローされることが予想されます。
実際にクラッシュを引き起こしていることを報告するために、私の最初のステップでXamarinのトリックを見つけていることは間違いありません。価値のあることについては、AndroidとiOSの両方でこの動作を観察しました。
- 更新日 -
私はうまくいけば問題を絞り込んでいます。私はXamarinのドキュメントからの情報のこのビットが見つかりました:
the framework will attempt to determine whether or not an adapter is making
progress by monitoring its network activity over the course of a minute. If
the network traffic over this window is close enough to zero the sync will
be cancelled.
Android.Content.AbstractThreadedSyncAdapter Class
私の疑惑は、アプリが終了した時点で同期が長い任意のネットワーク呼び出しを終了しましたが、まだすべての処理を残していることということですマッピングとデータベースは結果のデータを挿入します。したがって:
- この場合、どうすればわかりますか?私はOnSyncCanceled()メソッドを追加しようとすると、アプリケーションが終了したデバッガでヒットすることはありません。
- これは、別のスレッドでこれを回転させたようですが、この場合、同期プロセスだけでなく、アプリ全体が閉じてしまうのはなぜですか?ここで
SyncAdapter
public class SyncAdapterImpl : AbstractThreadedSyncAdapter
{
public SyncAdapterImpl(Context context, bool autoInitialize)
: base(context, autoInitialize)
{
}
public override void OnSyncCanceled()
{
base.OnSyncCanceled();
Console.WriteLine("Canceled");
}
public override void OnPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult)
{
IKernel kernel = new StandardKernel(new PlatformModule(), new CoreModule());
var syncService = kernel.Get<SyncService>();
SyncResultSummary syncResultSummary = new SyncResultSummary();
if (!extras.GetBoolean(ContentResolver.SyncExtrasUpload))
{
syncService.UpdateProfile().Wait();
var task = syncService.DownloadJobs();
task.Wait();
syncResultSummary = task.Result;
}
// send notifications with results
}
}
--update 2--
で何が起こっているかである私は、SyncAdapterService
クラスにProcess = ":sync"
を追加することが、殺されてから全アプリを防ぐことに気づきました同期自体は今失敗します。
[Service(Label = "SyncAdapterService", Exported = true, Process = ":sync")]
[IntentFilter(new String[] { "android.content.SyncAdapter" })]
[MetaData("android.content.SyncAdapter", Resource = "@xml/syncadapter")]
public class SyncAdapterService : Service
{
private SyncAdapterImpl _syncAdapter;
private object _syncAdapterMutex = new object();
public override void OnCreate()
{
base.OnCreate();
lock(_syncAdapterMutex)
{
if (_syncAdapter == null)
_syncAdapter = new SyncAdapterImpl(this.ApplicationContext, true);
}
}
public override IBinder OnBind(Intent intent)
{
return _syncAdapter.SyncAdapterBinder;
}
}
をそのを把握するために、もう少し物事のxamarinの方法を研究する必要があると思いますが、あなたを持っていますクラッシュ情報のアプリケーション出力/デバイスログを確認しましたか?未処理の例外が原因ではないと確信していますか? – Jason
私はコードをコメントアウトし、それを引き起こすものを見て、DBへの挿入から始めます。 –