0

當我得到UserRecoverableAuthIOExceptionAbstractThreadedSyncAdapter,我創建一個通知如下。如何暫停和恢復在Android的線程

下面是我如何創建服務:

@覆蓋 公衆的IBinder onBind(意向爲arg0){// TODO自動生成方法存根 Log.i( 「服務」, 「主題開始」 ); return this.getSyncAdapter()。getSyncAdapterBinder(); }

private GoogleTasksSyncAdapter getSyncAdapter() { 
    if (syncAdapter == null) 
    { 
     Log.i("Service", "syncAdapter started"); 
     syncAdapter = new MySyncAdapter(this); 

    } 
    return syncAdapter; 

} 

一旦線程啓動,我養的通知。但是,一旦用戶點擊通知,他們就可以看到授權活動。在授權後如何從最後一點恢復。即在Syncadapter中關閉活動後如何獲得通知。

回答

1

SyncAdapter線程正在運行,並且您想在SyncAdapter結束時收到通知,對不對?

因此,您可以使用BroadCast與SyncAdapter線程通信。

在你SyncAdapter類:

Intent i = new Intent(SYNC_FINISHED); 
    context.sendBroadcast(i); 
    Log.i(TAG, "Network synchronization complete"); 

在活動或一個片段:

private BroadcastReceiver syncFinishedReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG, "Sync finished!!"); 

     // Here you can send your notification or another thing that you want 
    } 
}; 

@Override 
public void onStart() { 
    super.onStart(); 
    getActivity().registerReceiver(syncFinishedReceiver, new IntentFilter(SyncAdapter.SYNC_TASK_FINISHED)); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    getActivity().unregisterReceiver(syncFinishedReceiver); 
} 

注:SYNC_FINISHED常數,你可以在你SyncAdapter先前定義

我希望我幫了你。

問候!

+0

您好,感謝很多後重新啓動同步。但是我希望一旦掛起的意圖授權完成回調。即我將獲得授權屏幕,我將授權該服務,一旦關閉,我需要從開始同步活動 – Naruto

+0

的位置恢復,但是,如果發生異常,syncAdapter將繼續運行,因此SyncAdapter線程將完成。您可以嘗試以下方法:當同步方法生成異常時,您會收到通知,並使用Bundle在下一個方法中啓動另一個Sync活動。 ContentResolver.requestSync(account,CONTENT_AUTHORITY,bundle); 你瞭解我嗎?如果你願意,我會用代碼發佈另一個答案。我希望那些作品。 –

+0

嗨,我沒有得到你。我只想知道如何在通知活動完成後重新啓動同步。你可以請張貼一段代碼。請多謝支持 – Naruto

1

在你SyncAdapter你做這樣的事情:

@Override 
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { 

    Log.i(TAG, "Beginning network synchronization"); 

    if(extras.getBoolean(RUN_METHOD_1) || extras.getBoolean(RUN_ALL)) { 
     method1(); 
    } 
    if(extras.getBoolean(RUN_METHOD_2) || extras.getBoolean(RUN_ALL)) { 
     method2(); 
    } 
} 

public void method1(){ 
    try{ 
     // do something 

    } catch (Exception e) { 
     e.printStackTrace(); 

     // here you can send your notification when exception occours. 
    } 
} 

public void method2(){ 
    try{ 
     // do something 

    } catch (Exception e) { 
     e.printStackTrace(); 

     // here you can send your notification when exception occours. 
    } 
} 

在你的「授權」的代碼,你這樣做:

 Bundle b = new Bundle(); 
     b.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); 
     b.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); 
     b.putBoolean(SyncAdapter.RUN_METHOD_1, true); 

     ContentResolver.requestSync(account, CONTENT_AUTHORITY, b); 

這樣你就可以運行同步停止的地方。

問候!!!

0

這裏是解決方案,

我們需要使用syncResult.stats.numAuthExceptions講述例外,它會自動拋出消息。 syncResult.delayUntil拭目以待經過時間

How to show sync failed message