AbstractThreadedSyncAdapter 不会立即触发
AbstractThreadedSyncAdapter doesn't fire right away
我一直想知道为什么 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.access0(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.access0(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()
。
据我了解,您的 Activity 崩溃是因为它正在读取空表吗?您是否希望您的 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);
}
您提供要同步的 帐户 并将 expedited 设置为 true 以便 Android SyncManager 将在任何其他应用程序之前同步您的帐户。因为此同步请求设置为 'manual',这意味着 SyncManager 不会等待方便的时间,它只会打开收音机并开始同步所有应用程序,您的第一个。
但是,即使您执行了 requestSync,您也应该预料到 Internet 速度很慢,并且结果需要花费几毫秒到几秒甚至几分钟的时间才能由您的 SyncAdapter 写入您的数据库。与此同时,您的 Activity 已经启动并正在读取空表...
因此请确保您的 Activity 不会在空表上崩溃。
我一直想知道为什么 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.access0(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.access0(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()
。
据我了解,您的 Activity 崩溃是因为它正在读取空表吗?您是否希望您的 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);
}
您提供要同步的 帐户 并将 expedited 设置为 true 以便 Android SyncManager 将在任何其他应用程序之前同步您的帐户。因为此同步请求设置为 'manual',这意味着 SyncManager 不会等待方便的时间,它只会打开收音机并开始同步所有应用程序,您的第一个。
但是,即使您执行了 requestSync,您也应该预料到 Internet 速度很慢,并且结果需要花费几毫秒到几秒甚至几分钟的时间才能由您的 SyncAdapter 写入您的数据库。与此同时,您的 Activity 已经启动并正在读取空表...
因此请确保您的 Activity 不会在空表上崩溃。