【问题标题】:get notified when requestSync function completedrequestSync 功能完成时收到通知
【发布时间】:2012-03-15 01:49:05
【问题描述】:

我正在尝试使用此代码以编程方式启动日历同步

Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_FORCE, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true);

ContentResolver.requestSync(accounts[0], "com.android.calendar", bundle);

我想要一种方法,这样我就可以知道同步何时完成,这样我就可以从日历中读取数据 我试过这样做

while (ContentResolver.isSyncActive(accounts[0], "com.android.calendar")) {
System.out.println("looping: " + i);
}

readLocalCalendar();
readLocalEvents();

但是系统在同步结束之前退出循环,我仍然可以在状态栏中看到同步标志,所以有什么帮助我可以在同步完成后读取日历事件吗??

谢谢

【问题讨论】:

    标签: android android-layout android-intent android-emulator android-widget


    【解决方案1】:

    另一种选择是注册一个广播接收器,以告诉您同步何时完成,如下所示:

    public class UpdateableActivity extends Activity {
        public static final String ACTION_FINISHED_SYNC = "your.package.ACTION_FINISHED_SYNC";
    
        private static IntentFilter syncIntentFilter = new IntentFilter(ACTION_FINISHED_SYNC);
    
        private BroadcastReceiver syncBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // update your views
            }
        };
    
        @Override
        protected void onResume() {
            super.onResume();
            // register for sync
            registerReceiver(syncBroadcastReceiver, syncIntentFilter);
            // do your resuming magic
        }
    
        @Override
        protected void onPause() {
            unregisterReceiver(syncBroadcastReceiver);
            super.onPause();
        }
    }
    

    在你的 SyncAdapter 中使用这个完成后:

    getContext().sendBroadcast(new Intent(UpdateableActivity.ACTION_FINISHED_SYNC));  
    

    您也可以在启动或更新同步状态时使用它;)

    更新:更新了代码以避免泄漏并确保活动仍然处于活动状态(onResume/onPause)

    【讨论】:

      【解决方案2】:

      使用 addStatusChangeListener 实际上对我有用。

      here's 参考。

      别忘了添加所需的权限。

      【讨论】:

        【解决方案3】:

        使用ContentResolver.addStatusChangeListener (int mask, SyncStatusObserver callback) 获取同步状态更改的通知。 docs

        请不要永远循环,它的设计非常糟糕。使用上述方法,一切都是异步的,因此您不会浪费任何 cpu 周期。

        您还可以使用 ContentResolver.registerContentObserver (Uri uri, boolean notifyForDescendents, ContentObserver observer) docs 来获取特定 URI(如日历的 URI)更改的通知

        【讨论】:

        • 谢谢,但是我尝试了 SyncStatusObserver ,但是我遇到了一个问题,因为这两个方法“readLocalCalendar(); readLocalEvents()”对界面有影响,所以会触发一个异常说我不能从另一个线程修改视图!这是例外(E/JavaBinder(12336): android.view.ViewRoot$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能接触其视图。)
        【解决方案4】:

        尝试一个 AsyncTask :

        private class CustomTask extends AsyncTask<Void, Void, Void>{
        
              @Override
              protected Void doInBackground(Void... params) {
               // TODO sync your calendar
              }
        
              protected void onProgressUpdate(Void... progress) {
                //TODO display a spinner or something else to show progress
              }
        
              protected void onPostExecute(Void t){
               //TODO what you want when doInBackground has finished
        
              }
        
        }
        

        祝你好运!

        【讨论】:

          猜你喜欢
          • 2013-12-24
          • 1970-01-01
          • 2019-12-06
          • 1970-01-01
          • 2017-09-15
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多