我正在使用后台线程(asynctask)从手机中获取联系人&使用发布请求将其发送到服务器它适用于50到100个联系人但如果联系人超过500或1000则会崩溃,是否有其他方法可以执行此处理
答案 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
执行此操作,系统可能会在您的交易过程中终止您的流程,而且可能或可能不会通过。