NullPointer 当我调用 bindService()
Posted
技术标签:
【中文标题】NullPointer 当我调用 bindService()【英文标题】:NullPointer when I call bindService() 【发布时间】:2012-06-19 16:10:35 【问题描述】:我正在开发一个应用程序。为了简单起见,它有这样的设计:
ServiceManager CommService -------> 通过 AsyncTask 做事...
我正在尝试将我的 ServiceManager 绑定到 CommService。所以,CommService 有一个Binder。而且我有一个 NullPointerException,我不知道如何解决它。我认为 ServiceConnection 没有完成它的工作并且绑定没有激活。
这里是ServiceManager的代码:
public class ProbeManagerService extends Service implements ICommManager, ICommListener
private CommService mService;
private boolean mBound;
private ServiceConnection svc1 = new ServiceConnection()
public void onServiceConnected(ComponentName className, IBinder rawBinder)
CommBinder commBinder = (CommBinder) rawBinder;
mService = commBinder.getService();
mBound = true;
public void onServiceDisconnected(ComponentName className)
//commBinder = null;
mBound = false;
;
public void onCreate()
Log.i("ProbeManagerService, onCreate", "passage dans le onCreate du Service");
super.onCreate();
Intent bindIntent = new Intent(this, CommService.class);
//startService(bindIntent); changes nothing with or without this line
bindService(bindIntent, svc1, Context.BIND_AUTO_CREATE);
@Override
public IBinder onBind(Intent intent)
return null;
public int onStartCommand(Intent intent, int flags, int startId)
Log.i("ProbeManagerService, onStartCommand", "passage dans le onStartCommand du Service");
this.getActions();
return START_STICKY;
public void onDestroy()
super.onDestroy();
@Override
public void getActions()
if(mBound)
this.mService.getActions(this, urlGetActions, jsonGetActions, GET_ACTIONS);
else
System.out.println("On n'est pasl lié");
这里是CommService的代码:
public class CommService extends Service implements IComm
private final CommBinder binder = new CommBinder(this);
private HttpClient client;
public CommService()
super();
public void onCreate()
super.onCreate();
this.client = new DefaultHttpClient();
@Override
public IBinder onBind(Intent intent)
return binder;
public void onDestroy()
super.onDestroy();
this.client.getConnectionManager().shutdown();
// ============ METHODES A IMPLEMENTER DE L'INTERFACE IComm ==============
@Override
public void getActions(ICommListener listener, String url, String json, String type)
new SendHttpRequest(listener).execute(url, json, type);
这里是 CommBinder 的代码:
public class CommBinder extends Binder
private CommService service;
public CommBinder(CommService service)
this.service = service;
public CommService getService()
return this.service;
这里是Logcat:
06-19 18:03:35.665: I/ProbeManagerService, onCreate(25705): passage dans le onCreate du Service
06-19 18:03:35.775: I/System.out(25705): fichier lus
06-19 18:03:35.785: I/ProbeManagerService, onStartCommand(25705): passage dans le onStartCommand du Service
06-19 18:03:35.815: D/androidRuntime(25705): Shutting down VM
06-19 18:03:35.815: W/dalvikvm(25705): threadid=1: thread exiting with uncaught exception (group=0x40015560)
06-19 18:03:35.855: E/AndroidRuntime(25705): FATAL EXCEPTION: main
06-19 18:03:35.855: E/AndroidRuntime(25705): java.lang.RuntimeException: Unable to start service .probecontroller.android.services.ProbeManagerService@40516da8 with Intent cmp=.probecontroller.android.controller/.probecontroller.android.services.ProbeManagerService : java.lang.NullPointerException
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2052)
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.app.ActivityThread.access$2800(ActivityThread.java:117)
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:994)
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.os.Handler.dispatchMessage(Handler.java:99)
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.os.Looper.loop(Looper.java:123)
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.app.ActivityThread.main(ActivityThread.java:3683)
06-19 18:03:35.855: E/AndroidRuntime(25705): at java.lang.reflect.Method.invokeNative(Native Method)
06-19 18:03:35.855: E/AndroidRuntime(25705): at java.lang.reflect.Method.invoke(Method.java:507)
06-19 18:03:35.855: E/AndroidRuntime(25705): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-19 18:03:35.855: E/AndroidRuntime(25705): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-19 18:03:35.855: E/AndroidRuntime(25705): at dalvik.system.NativeStart.main(Native Method)
06-19 18:03:35.855: E/AndroidRuntime(25705): Caused by: java.lang.NullPointerException
06-19 18:03:35.855: E/AndroidRuntime(25705): at .probecontroller.android.services.ProbeManagerService.getActions(ProbeManagerService.java:162)
06-19 18:03:35.855: E/AndroidRuntime(25705): at .probecontroller.android.services.ProbeManagerService.onStartCommand(ProbeManagerService.java:124)
06-19 18:03:35.855: E/AndroidRuntime(25705): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2039)
06-19 18:03:35.855: E/AndroidRuntime(25705): ... 10 more
06-19 18:03:51.226: I/Process(25705): Sending signal. PID: 25705 SIG: 9
欢迎任何帮助。解决这个问题已经花费了几个小时,我阅读了很多论坛、帖子,但根本没有任何效果。
【问题讨论】:
这是同样的问题,但有一个例子:***.com/questions/9211994/… 【参考方案1】:显然,您在绑定服务之前在ProbeManagerService
上调用getActions()
,因为唯一可以是null
的是mService
。 bindService()
是异步的;当该方法返回时,您还不会被绑定。
【讨论】:
感谢您的回答,CommonsWare。那么,我怎么能确定绑定完成了呢?有什么方法吗? @Eriatolc:当然,这是您已经实施的onServiceConnected()
。您需要确保在调用onServiceConnected()
之前永远不会调用getActions()
。
感谢您的关注。如果我理解得很好,我可以在每次调用方法之前检查布尔值mBound
,例如getActions()
。如果mBound = false
,则服务未链接。但是,Service
调用了onCreate()
,其中bindService()
已完成;并直接转到onStartCommand()
。如果第一次读取此方法,我怎么能再次执行onStartCommand()
,但边界不在这里?事实上,这个Service
将是一种控制器,所以,如果所有onStartCommand()
一次完成(并完成),正确使用它的最佳方法是什么?
@Eriatolc:我会首先摆脱所有这些服务并从头开始。首先,您可能不需要多个服务,更不用说将一个服务绑定到另一个服务了。您的目标应该是更少服务,而不是更多服务。
它让我回到this thread,了解如何设计这个应用程序。我必须定期(由用户定义)询问远程服务器以执行操作。恢复并执行操作后,我必须将结果发送到另一台服务器。但是(这对我来说是个难点),所有这些都必须在“后台”中工作,没有打开视图,也没有用户交互(他可以用手机做任何他想做的事)。用户只需在需要时启动/停止应用程序。我认为最好的例子是邮件客户端或音乐播放器,我不知道如何设计以上是关于NullPointer 当我调用 bindService()的主要内容,如果未能解决你的问题,请参考以下文章
setAdapter() 上的 NullPointer 异常
Finder 功能不起作用,基本适配器调用 NullPointer [重复]
使用PrimeFaces自动完成获取nullpointer异常
Spring Batch - 分块和多线程步骤 - RowMapper 中的 Nullpointer 异常