2017-08-13 7 views
1

バックグラウンドAPIコール中に閉じるXamarinフォームアプリがあります。私はこのプロジェクトにシンクコードをあまり書きませんでしたが、私はそれをトラブルシューティングしたままにしています。ここでは、コードが何をしているかの概要は次のとおりです。XamarinのフォームAbstractThreadedSyncAdapterがエラーまたは例外なしで閉じる

  1. API呼び出しが消灯し、JSON文字列が正しくC#のオブジェクトのリストにシリアライズされ、正常
  2. 返されます。
  3. オブジェクトは、アプリケーションで気になるプロパティのみを含むローカルクラスにマップするメソッドに渡されます。
  4. このマッピングの後、これらのオブジェクトを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

私の疑惑は、アプリが終了した時点で同期が長い任意のネットワーク呼び出しを終了しましたが、まだすべての処理を残していることということですマッピングとデータベースは結果のデータを挿入します。したがって:

  1. この場合、どうすればわかりますか?私はOnSyncCanceled()メソッドを追加しようとすると、アプリケーションが終了したデバッガでヒットすることはありません。
  2. これは、別のスレッドでこれを回転させたようですが、この場合、同期プロセスだけでなく、アプリ全体が閉じてしまうのはなぜですか?ここで

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; 
    } 
} 
+0

をそのを把握するために、もう少し物事のxamarinの方法を研究する必要があると思いますが、あなたを持っていますクラッシュ情報のアプリケーション出力/デバイスログを確認しましたか?未処理の例外が原因ではないと確信していますか? – Jason

+0

私はコードをコメントアウトし、それを引き起こすものを見て、DBへの挿入から始めます。 –

答えて

0

私の理論はSyncAdapterが終わった後、APIは、それがすべてのネットワークトラフィックを作っ行われていたが、それでも処理とDBの書き込みの束と残された呼び出すことです。 Xamarinはネットワークトラフィックがなく、「やって、同期している」と言っていて、実行中のプロセスを強制終了していました。これはアプリ全体が実行されていたプロセスと同じでした。何が起こったのか明示的に警告するものはありません。

だから私はidと更新された時間を持つそれぞれのレコードの小さなオブジェクトを取り戻してから、それらを一つずつ順番にループします(並列に実行することはできません。同じ問題) - 解決策は、あなたがまだ仕事をする必要があるときに、何かネットワーク活動を盛り上げることです。

おそらく、データを引き戻すと、何か他のものにそれを渡すことができるようによりよいだろうが、私は

関連する問題