Android AbstractThreadedSyncAdapter不';不要马上开火

Android AbstractThreadedSyncAdapter不';不要马上开火,android,android-syncadapter,Android,Android Syncadapter,我一直在想,为什么AbstractThreadedSyncAdapter在我运行应用程序后不执行同步,而是等待5-10分钟,然后开始使用API请求下载数据并填充我的表,这会导致此错误: 02-03 05:03:34.954 6061-6061/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.android.movies

我一直在想,为什么AbstractThreadedSyncAdapter在我运行应用程序后不执行同步,而是等待5-10分钟,然后开始使用API请求下载数据并填充我的表,这会导致此错误:

 02-03 05:03:34.954 6061-6061/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                  Process: com.example.android.moviesapp.app, PID: 6061
                                                  java.lang.RuntimeException: Unable to start activity
 ComponentInfo{com.example.android.moviesapp.app/com.example.android.moviesapp.app.MainActivity}:
 java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
  at android.app.ActivityThread.access$800(ActivityThread.java:135)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:136)
  at android.app.ActivityThread.main(ActivityThread.java:5001)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
  at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
  at com.example.android.moviesapp.app.DetailFragment.ReadTrailersDetailsFromDB(DetailFragment.java:70)
  at com.example.android.moviesapp.app.DetailFragment.onCreateView(DetailFragment.java:114)
  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
  at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:330)
  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547)
  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
  at android.app.Activity.performStart(Activity.java:5241)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
  at android.app.ActivityThread.access$800(ActivityThread.java:135) 
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
  at android.os.Handler.dispatchMessage(Handler.java:102) 
  at android.os.Looper.loop(Looper.java:136) 
  at android.app.ActivityThread.main(ActivityThread.java:5001) 
  at java.lang.reflect.Method.invokeNative(Native Method) 
  at java.lang.reflect.Method.invoke(Method.java:515) 
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
  at dalvik.system.NativeStart.main(Native Method)

Android SyncManager的全部要点是让它决定何时进行同步。这是为了提高电池效率,以便系统能够灵活地从不同的应用程序中批量同步操作。这样做意味着,当所有应用程序同步后,系统可以长时间关闭耗电的收音机

因此,如果您使用Android SyncManager(通过实现SyncAdapter模式),那么您必须期望它在无法控制的时候调用
SyncAdapter.onPerformSync()

据我所知,您的活动崩溃是因为它正在读取空表?您希望SyncAdapter已经填充了这些表吗

这是没有办法的,你必须使你的活动,以便他们可以处理空表。你必须为此额外付一张支票

请注意,您可以通过以下方式触发即时同步:

/**
 * Starts a manual sync operation, i.e. independent of the automatic sync settings.
 *
 * @param context   System's service locator
 * @param account   The account to sync
 * @param expedited Make this sync a priority system wide
 */
public static void requestSync(Context context, Account account, boolean expedited) {
    Bundle extras = new Bundle();
    extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
    extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, expedited);
    ContentResolver.requestSync(account, Contract.AUTHORITY, extras);
}
您提供了要同步的帐户,并将“加急”设置为true,以便Android SyncManager在任何其他应用程序之前同步您的帐户。由于此同步请求设置为“手动”,这意味着SyncManager不会等待方便的时间,它只需打开收音机并开始同步所有应用程序,这是您的第一个应用程序

但是,即使您执行了requestSync,您也应该预料到internet速度很慢,并且在SyncAdapter将结果写入数据库之前,结果将需要几毫秒到几秒钟甚至几分钟的时间。与此同时,您的活动已经启动,正在读取空表


因此,请确保您的活动不会在空表上崩溃。

DetailFragment.java行号70中的数组大小问题它显示了DetailFragment.java上的ArrayIndexOutOfBoundsException,因为表是空的,我的syncAdapter中的onPerformSync延迟启动,应用程序无法填充其表,并给出了以前的错误,同步运行后,我再次运行该应用程序,它工作正常,我想知道为什么延迟启动同步程序。谢谢你的详细回答,我现在很清楚,非常感谢:)