使用后台线程获取联系人会使应用程序崩溃

时间:2014-06-18 07:02:43

标签: android android-asynctask

我正在使用后台线程(asynctask)从手机中获取联系人&使用发布请求将其发送到服务器它适用于50到100个联系人但如果联系人超过500或1000则会崩溃,是否有其他方法可以执行此处理

2 个答案:

答案 0 :(得分:3)

您应该创建一个在后台运行的服务,并将联系人分批推送到服务器。

您可以通过3个步骤解决此问题:

1.创建一个从IntentService扩展的类,并在onHandleIntent()方法中调用将联系人推送到服务器的函数。

     public class ContactPushSerive extends IntentService {
       @Override
       protected void onHandleIntent(Intent intent) {
         pushContacts();    
       }
     }

2.推动触点的功能应在内部创建批量触点,并一次推送一批。您可以在一批中选择50个联系人的批量大小。

     public static void pushContacts() {

                    int BATCH_SIZE = 50;

        //create getContactsFromOS() to fetch OS Contacts
        List<Contact> contactsList = getContactsFromOS();

        if (contactsList != null && contactsList.size() > 0) {

            // Batching contact push
            for (int i = 0; i < (contactsList.size() / BATCH_SIZE) + 1; i++) {
                List<Contact> subList = null;
                if ((i + 1) * BATCH_SIZE > contactsList.size()) {
                    subList = contactsList.subList(i * BATCH_SIZE, contactsList.size());
                }
                else {
                    subList = contactsList.subList(i * BATCH_SIZE, (i + 1) * BATCH_SIZE);
                }

                //push the contacts to the server using 
                pushContacts(subList);

            }
        }
      }

3.从您的代码中拨打此服务:

    //time after which the service should start , currently set to 2 min
    long time = System.currentTimeMillis() + (2l * 60 * 1000);

    //create intent to invoke the ContactPushService
    Intent intent = new Intent(context, ContactPushSerive.class);

    //Start the ContactPushService after 2 min using the Pending Intent and setting the alarm to fire after 2 min
    PendingIntent contactServiceIntent = PendingIntent.getService(context, -15, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmUtils.setAlarm(context, contactServiceIntent, time);

答案 1 :(得分:0)

您可以使用IntentService。如果您要向服务器发送数据,IntentService在这方面非常有用,因为您可以开始忘记。例如,用户可以在您的应用中输入评论,然后按"send""Send"将启动IntentService获取评论,并在后台线程中将其发送到您的服务器。如果您在AsyncTask中使用Activity执行此操作,系统可能会在您的交易过程中终止您的流程,而且可能或可能不会通过。