被调用的IntentService onCreate(),但 onHandleIntent() 没有被调用

3

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

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
    }
}

我有两个测试场景:
  • 数据包含2000个对象
  • 数据包含4000个对象
当有2000个对象时,Service无误地运行。
但是当有4000个对象时,仅调用ServiceonCreate()方法,而onHandleIntent()则没有被调用。应用程序在一段时间后会出现ANR。
我已经通过对onHandleIntent()第一行设置日志和断点的方式进行了测试,当Data包含4000个对象时,该方法根本不会被调用。
未抛出TransactionTooLargeException
我没有收到任何异常抛出,也不知道出了什么问题。
这种行为的原因可能是什么?

尝试将JSON保存在SQLite中,以便您可以通过从IntentService类调用方法直接访问它。 - Keyur Lakhani
也许这个SO帖子会有所帮助:如果Binder事务失败,可能不会总是出现TransactionTooLargeException。 - Bö macht Blau
1个回答

0

如果您正在过滤logcat,则可能看不到TransactionTooLargeException。在Intent中传递的数据量存在一个合理的限制。将4000个对象序列化为JSON绝对太多了!这是错误的方法。您的应用程序架构有缺陷。

您可以简单地将这4000个对象存储在静态变量中,以便Service可以在无需将它们序列化并从Activity传递到Service,然后反序列化它们的情况下访问它们。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接