IntentService的java.lang.InstantiationException错误

来源:互联网 发布:slack windows 编辑:程序博客网 时间:2024/06/07 19:16

======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
======================================================

关于继承intentservice,构造函数需要注意一个地方,eclipse默认生成的构造函数是

public myintentservice(string name) {

super(name);

}

而官方文档的示例中是没有参数的构造方法,使用eclipse这个默认构造函数的话会报一个运行时错误: java.lang.instantiationexception,在google groups里找到了解决办法,继承intentservice的类必须有一个public的无参的构造函数,将上面eclipse自动生成的构造函数改为下面这样的就可以了:

public myintentservice() {

super("somename");

}

为什么要这样改,看intentservice构造函数的源码:

public intentservice(string name) {

super();

mname = name;

}

sdk文档里说构造函数里面的服务名字只在调试时有用,可以随便写一个名字。

另一个需要特别指出的时,在onhandleintent里不需要自己处理线程,或者新启线程,intentservice默认会为队列中的任务启动后台线程,源码中的实现是这样的:

private final class servicehandler extends handler {

public servicehandler(looper looper) {

super(looper);

}

@override

public void handlemessage(message msg) {

onhandleintent((intent)msg.obj);

stopself(msg.arg1);

}

}

@override

public void oncreate() {

super.oncreate();

handlerthread thread = new handlerthread("intentservice[" + mname + "]");

thread.start();

mservicelooper = thread.getlooper();

mservicehandler = new servicehandler(mservicelooper);

}

看源码可以得知onhanldeintent()是在新的后台线程handlerthread里执行的,所以不需要要我们自己新开线程。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
原创粉丝点击