Java 调用了IntentService onCreate(),但未调用OnHandleContent()

Java 调用了IntentService onCreate(),但未调用OnHandleContent(),java,android,android-service,intentservice,Java,Android,Android Service,Intentservice,我正在使用以下方法启动IntentService: private void startMyService(Data data) { Intent intent = new Intent(this, MyService.class); intent.putExtra(KEY_DATA, data.toJson()); startService(intent); } 数据类: public class Data extends ArrayList<MyObject&

我正在使用以下方法启动
IntentService

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

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);
    }
}
我有两个测试场景:

  • 数据包含2000个对象
  • 数据可容纳4000个对象
对于2000个对象,
服务
可以完美运行

对于4000个对象,调用
服务
onCreate()
方法,就是这样<代码>onHandleIntent()未被调用。应用程序只是在一段时间后抛出一个ANR

我已经用
Log.d()
调用和
onHandleIntent()
第一行上的断点进行了测试,当
Data
包含4000个对象时,它根本不被调用

TransactionTooLargeException
未被抛出

我根本没有抛出异常,不知道出了什么问题


这种行为的原因可能是什么?

如果您正在筛选logcat,则可能看不到
TransactionTooLargeException
。在
意图中可以传递的数据量有一个合理的限制。4000个序列化为JSON的对象肯定太多了!这是错误的做法。您的应用程序架构有缺陷

您只需将4000个对象存储在一个
静态
变量中,这样
服务
就可以访问它们,而不必序列化它们,将它们从
活动
传递到
服务
,然后反序列化它们


或者,您需要将4000个对象序列化为一个文件,或者使用数据库保存数据。

尝试将json保存在sqlite中,以便您可以通过从intentService类调用方法直接访问它。这可能会有所帮助:如果绑定器事务失败,似乎并不总是存在TransactionTooLargeException
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
    }
}