gpt4 book ai didi

android - AbstractThreadedSyncAdapter 不会立即触发

转载 作者:行者123 更新时间:2023-11-30 01:35:22 26 4
gpt4 key购买 nike

我一直想知道为什么 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 的全部意义在于让它决定何时要进行同步。这是为了提高电池效率,以便系统可以灵活地将来自不同应用程序的操作批量同步。这样做意味着当所有应用程序都已同步时,系统可以关闭耗电量大的 radio 更长时间。

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

据我了解,您的 Activity 崩溃是因为它正在读取空表吗?您希望这些表已经被您的 SyncAdapter 填满了吗?

没有办法解决它,您必须使您的 Activity 能够处理空表。您将不得不为此支付额外的支票。

请注意,您可以触发立即同步:

/**
* 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 将在任何其他应用程序之前同步您的帐户。由于此同步请求设置为“手动”,这意味着 SyncManager 不会等待方便的时间,它只会打开 radio 并开始同步所有应用程序,这是您的第一个。

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

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

关于android - AbstractThreadedSyncAdapter 不会立即触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35174023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com