为啥我的 AsyncTask 在应用程序启动期间没有执行?

Posted

技术标签:

【中文标题】为啥我的 AsyncTask 在应用程序启动期间没有执行?【英文标题】:Why my AsyncTask is not executing during application start?为什么我的 AsyncTask 在应用程序启动期间没有执行? 【发布时间】:2015-09-03 16:10:05 【问题描述】:

我需要在应用程序启动时将所有电话簿联系人数据插入我的本地应用程序 sqlite 数据库中。为此,我实现了一个名为 LoadContacts.java 的类,它必须 @ 987654322@。此外,我有多个必须扩展应用程序类的类,我将这些类彼此子类化。

这些多个类是GenerateFacebookSignature extends ApplicationVolleyAppController extends GenerateFacebookSignatureSessionManagement extends VolleyAppControllerLoadContacts extends SessionManagement。这是我的类层次结构。

在 LoadContacts.java 中编写的异步任务没有执行,因为当我检查了 DatabaseHelper 类中的附加调试器时,它返回空光标。

这是我的 LoadContacts.java 的代码。

public class LoadContacts extends SessionManagement 
    Context context;
    Uri contactsUri, contactsDataUri;
    Cursor contactsCursor, contactsDataCursor, birthDayCursor;
    String contactId;
    GetAllPhoneBookContacts getAllPhoneBookContacts;
    DatabaseHelper databaseHelper = new DatabaseHelper(getApplicationContext());

    public LoadContacts(Context context) 
        super(context);
    

    @Override
    public void onCreate() 
        super.onCreate();

        getAllPhoneBookContacts = new GetAllPhoneBookContacts();
        getAllPhoneBookContacts.execute();
    

    public class GetAllPhoneBookContacts extends AsyncTask 

        @Override
        protected Object doInBackground(Object[] params) 
            contactsUri = ContactsContract.Contacts.CONTENT_URI;
            contactsCursor = getContentResolver().query(contactsUri, null, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC ");
            if (contactsCursor != null && contactsCursor.getCount() > 0) 
                if (contactsCursor.moveToFirst()) 
                    do 
                        contactId = contactsCursor.getString(contactsCursor.getColumnIndex("_ID"));

                        contactsDataUri = ContactsContract.Data.CONTENT_URI;
                        contactsDataCursor = getContentResolver().query(contactsDataUri, null, ContactsContract.Data.CONTACT_ID + "=" + contactId, null, null);

                        String displayName = "";
                        String birthday = "";

                        if (contactsDataCursor.moveToFirst()) 
                            displayName = contactsDataCursor.getString(contactsDataCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
                            birthDayCursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[]  ContactsContract.CommonDataKinds.Event.DATA , ContactsContract.Data.CONTACT_ID + "=" + contactId + " AND " + ContactsContract.Data.MIMETYPE + "= '" + ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE + "' AND " + ContactsContract.CommonDataKinds.Event.TYPE + "=" + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY, null, ContactsContract.Data.DISPLAY_NAME);
                            if (birthDayCursor != null) 
                                if (birthDayCursor.getCount() > 0) 
                                    while (birthDayCursor.moveToNext()) 
                                        birthday = birthDayCursor.getString(0);
                                    
                                
                            
                            do 
                            
                            while (contactsDataCursor.moveToNext());

                                databaseHelper.insertIntoContacts(contactId, displayName, birthday);
                        
                    
                    while (contactsCursor.moveToNext());
                
            
            return null;
        
    
 

请检查我做错了什么或为什么联系人没有插入到我的本地 sqlite 数据库中。如果需要任何其他代码,我准备发布它。感谢您的任何帮助或建议。

【问题讨论】:

在 Manifest 文件中,您将哪个类定义为应用程序? 添加您的 DatabaseHelper 类。 我在我的 Manifest 文件中添加 SessionManagement。 @Ankit 我无法发布整个数据库类,但我将发布联系人表结构和获取联系人数据的方法。请参阅上面的修改。 @AshishKumarGupta 只需在 SessionManagement onCreate method 内启动 asynkTask。 【参考方案1】:

如果SessionManagement您已在您的清单文件中定义为应用程序类。然后你必须在 sessionManagement onCreate 方法中启动 asyncTask。

【讨论】:

对不起,我正在尝试你的方式。 我需要你的建议,你能帮帮我吗。 当我没有实现 LoadContacts.java 时,我有应用程序类层次结构,因为 GenerateFacebookSignature 扩展了 Application,VolleyAppController 扩展了 GenerateFacebookSignature,SessionManagement 扩展了 VolleyAppController 并且我已经在我的清单文件中定义了 VolleyAppController 并且一切正常。现在哪个类最适合编写异步任务,以便正确执行。 查看您在 Manifest 中定义的哪个类将成为您的应用程序类。然后在 onCreate 方法中 super.onCreate() 将调用父 onCreate 方法。但它永远不会调用子 onCreate 方法。明白了吗? @AshishKumarGupta 如果它解决了您的问题,请接受它作为答案。

以上是关于为啥我的 AsyncTask 在应用程序启动期间没有执行?的主要内容,如果未能解决你的问题,请参考以下文章

最佳实践:方向更改期间的 AsyncTask

在启动画面期间获取用户的地理位置

为啥我的 AsyncTask 在主线程上运行?

为啥我的 AsyncTask 会冻结我的 UI 线程?

在 Android 的 AsyncTask 期间更改活动是不是被认为是不好的做法?

在 Android 应用程序中使用 AsyncTask 在 for 循环期间更新 ProgressBar