Я начинаю в 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
, и вообще не знаю, что случилось.
В чем может быть причина такого поведения?
Попробуйте сохранить json в sqlite, чтобы вы могли прямо обращаться к нему, вызывая метод из намерения. Класс обслуживания – Manifest
может быть таким [SO post] (http://stackoverflow.com/a/14379016/5015207) будет полезен: похоже, не всегда будет TransactionTooLargeException, если транзакция Binder не выполняется – 0X0nosugar