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 的是mServicebindService() 是异步的;当该方法返回时,您还不会被绑定。

【讨论】:

感谢您的回答,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 异常

Navigation Drawer 方法收到 NullPointer 异常

尝试将对象传递给活动时得到nullpointer