2016-10-01 97 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个对象,调用ServiceonCreate()方法,就是这样... onHandleIntent()未被调用。一段时间后,该应用只是抛出一个ANR。

我已经与上onHandleIntent()第一线既Log.d()电话和断点测试,它是不是在所有的时候Data持有4000个对象调用。

TransactionTooLargeException不是抛出。

我没有得到Exception,根本不知道有什么问题。

这种行为的原因是什么?

+0

尝试在sqlite中保存json,以便您可以通过调用intentService类中的方法直接访问它 – Manifest

+0

可能是[SO帖子](http://stackoverflow.com/a/14379016/5015207)会有帮助:如果Binder事务失败,似乎不会总是有TransactionTooLargeException – 0X0nosugar

回答

0

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

您可以将4000级的对象只是存储在一个static变量,以便Service可以得到,而不必它们序列化,从Activity通过他们Service,然后反序列化他们。

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