2016-10-01 2 views
3

Я начинаю в IntentService со следующим методом:IntentService OnCreate() называется, но onHandleIntent() не

private void startMyService(Data data) { 
    Intent intent = new Intent(this, MyService.class); 
    intent.putExtra(KEY_DATA, data.toJson()); 
    startService(intent); 
} 

Data класс:

public class Data extends ArrayList<MyObject> { 

    public Data() { 
     super(); 
    } 

    public Data(Collection<MyObject> myObjects) { 
     super(myObjects); 
    } 

    public String toJson() { 
     return new Gson().toJson(this); 
    } 

    public static Data fromJson(String jsonString) { 
     return new Gson().fromJson(jsonString, Data.class); 
    } 
} 

Соответствующая часть IntentService:

public class MyService extends IntentService { 

    private Data data; 

    public MyService() { 
     super("myServiceName"); 
    } 

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

     // this gets called properly 
     Log.d("myTag", "Service onCreate()"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     // this is not called in case of the bigger dataset 
     Log.d("myTag", "Service onHandleIntent()"); 

     String dataJson = intent.getStringExtra(KEY_DATA); 
     data = Data.fromJson(dataJson); 

     // doing stuff with data 
    } 
} 

У меня есть 2 тестовых сценария:

  • данных имеет 2000 объектов
  • данных содержит 4000 объектов

С 2000 объектов, в Service пробеги безупречно.

С 4000 объектами вызывается метод onCreate()Service и все ... onHandleIntent() не вызывается. Приложение просто бросает ANR через некоторое время.

Я проверил как с номерами Log.d(), так и с точками останова в первой строке onHandleIntent(), он не вызывается вообще, когда Data содержит 4000 объектов.

TransactionTooLargeExceptionне брошенный.

Я не получаю Exception, и вообще не знаю, что случилось.

В чем может быть причина такого поведения?

+0

Попробуйте сохранить json в sqlite, чтобы вы могли прямо обращаться к нему, вызывая метод из намерения. Класс обслуживания – Manifest

+0

может быть таким [SO post] (http://stackoverflow.com/a/14379016/5015207) будет полезен: похоже, не всегда будет TransactionTooLargeException, если транзакция Binder не выполняется – 0X0nosugar

ответ

0

Вы можете не видеть TransactionTooLargeException, если вы фильтруете логарифм. Существует разумное ограничение на количество данных, которое вы можете передать в Intent. 4000 объектов, сериализованных для JSON, определенно слишком мукны! Это неправильный подход. Ваша архитектура приложения ошибочна.

Вы можете просто хранить 4000 объектов в static переменном, так что Service может получить к ним без необходимости сериализации их, передать их от Activity к Service, затем десериализациям их.

Кроме того, вам необходимо сериализовать 4000 объектов в файл или использовать базу данных для хранения данных.

Смежные вопросы