Android sendBroadcast(intent)提供空指针异常

Android sendBroadcast(intent)提供空指针异常,android,service,android-intent,broadcastreceiver,data-transfer,Android,Service,Android Intent,Broadcastreceiver,Data Transfer,这是我今天的第二篇博文,因为修复第一篇博文会导致另一个我正在努力解决的问题。我想使用广播和意图将数据包从服务发送回UI。我成功地绑定并启动了服务 空指针异常出现在服务内部的sendBroadcast上。将UI绑定到服务后,服务类确实会重新调用其构造函数。这是从另一个类发生的,因此上下文不容易使用。所以我猜sendBroadcast没有地方可去: 我怀疑这是我的问题…在初始绑定之后重新调用服务构造函数。我有onDestroy、onPause和onResume,上面有一个绑定和解除绑定。 任何想法

这是我今天的第二篇博文,因为修复第一篇博文会导致另一个我正在努力解决的问题。我想使用广播和意图将数据包从服务发送回UI。我成功地绑定并启动了服务

空指针异常出现在服务内部的sendBroadcast上。将UI绑定到服务后,服务类确实会重新调用其构造函数。这是从另一个类发生的,因此上下文不容易使用。所以我猜sendBroadcast没有地方可去: 我怀疑这是我的问题…在初始绑定之后重新调用服务构造函数。我有onDestroy、onPause和onResume,上面有一个绑定和解除绑定。 任何想法或建议都会很好,或者我只是做错了,还有别的办法吗

编辑 以前的绑定问题现在已经解决了,由于我是新加入论坛的,所以在接受答案时有点延迟…对不起

类图是这样的,它被移植到Ccode

Activity doBind on Curve.class-->Activity启动一个工作类,该工作类未被视为服务Comm.class,并带有一些Comm的处理程序->该Comm启动另一个工作类->上一个工作类最终调用new Curve.class

这是最后一个阶段Curve.class,sendBroadcastReceiver在其中抛出一个nullpointer ref,因为绑定器丢失。 我用一个简单的计时器测试了broadcastreceiver,在这两个计时器之间去掉了工人类,效果很好。当Curve.class稍后在层次结构的更深处被调用,并且绑定器为空或丢失时,问题就开始了

我从曲线中删除了活页夹的所有引用,onBind除外。这可能不是个好主意。同样,如果与直接从UI启动的简单计时器一起使用,则下面的代码不起作用,而不是其他工作类

这里还有一些代码: 服务

    public class Curve extends Service
{
    private NewCurvePointEventArgs newpoint = null;
    private static final String TAG = "Curve";

    Intent intent;
    int counter = 0;


    @Override
    public void onCreate() {
        super.onCreate();   

    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        IBinder mBinder = new LocalBinder<Curve>(this);
        return mBinder;
    }
    @Override
    public void onStart(Intent intent, int startId) {

    }
    @Override
    public void onDestroy() {

    }
    public Curve(){

    }
    private void refreshintent(NewCurvePointEventArgs tmp)
    {
        ArrayList<String> thepoint = new ArrayList<String>();
        thepoint.add()//various things added here

         Bundle bundle = new Bundle();
            // add data to bundle
            bundle.putStringArrayList("New_Point", thepoint);

        intent = new Intent();
        intent.setAction(NEWCURVE_POINT);
        intent.putExtra("NEW_POINT", bundle

        sendBroadcast(intent);

    }
因此,对CurveService进行实例化肯定会有问题,它必须是这样的:publicCurve{}?? 无论如何,非常感谢你的帮助和建议

最终编辑+1..lol

UI创建ClientConnection的新实例,该实例依次创建CommMeasure的新实例,最后CommMeasure创建Curve的新实例以访问Curve.addpoint。 我认为这个线程和另一个链接1超越了一个简单的android问题,突出了代码移植的困难。例如,任何.Net开发人员阅读本文都会比我更快地了解android的一些特性。这里也有很好的工作代码。
感谢所有帮助过你的人,特别是贾斯汀·布雷特费勒,你最好的做法就是效仿Android APIDemos的例子

要像您希望使用的那样使用的服务:

查看此文件中的绑定类,以查看执行绑定的类,就像您应该执行的那样:

最后,如果您的构造函数在您的服务上被调用了两次,那么您没有正确地绑定到您的服务,或者您正在从它解除绑定并意外地再次绑定到它

编辑 从堆栈跟踪中可以看出,CommMeasure需要引用在onServiceConnected中接收的Curve实例

编辑2
如果您真的想让您的生活变得简单,请将getApplicationContext传递给您的CommMeasure类,然后仅从该类发送appContext.sendBroadcast以发送您的观点。这将防止您在长期运行的任务中需要对服务的引用

如果有人成功地回答了你的第一篇帖子,请确保你记得接受答案。你能从logcat发布异常stacktrace吗?如果你发布了所有代码,并清楚、简洁地解释了你正试图做的事情,这可能会非常有帮助。我没有看到引用的sendBroadcast代码。不幸的是,sendBroadcast中的空指针没有堆栈跟踪。如果发生崩溃,logcat中应该始终有堆栈跟踪。您检查了吗?服务和绑定已启动,然后再次调用服务的构造函数。我想不幸的是,这一切都需要改变。你似乎很接近。曲线中应该发生什么?当你说上一个工人类最终调用了新的Curve.class时,你是什么意思?在重新阅读你的编辑之后,我想让你自己永远不会实例化Curve的实例。Android操作系统应该是唯一一个创建服务或活动的操作系统。如果你正在创建一个Curve实例,你很可能会得到一个NPE,因为这个服务没有附加任何上下文。在C中,它只是一个工人类,使用事件处理程序发送有关的数据,但在这里似乎不起作用:我不确定您是如何使用事件处理程序的,所以我不能提供太多帮助。是否正在使用辅助项上的事件注册曲线服务?如果是这样的话,只要确保你通过了弯道就可以了 从OnService连接获取。
        private BroadcastReceiver CurveReceiver  = new BroadcastReceiver(){

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Curve.NEWCURVE_POINT)) {
            displaynewpoint(intent); 

        }
    }
};
private ServiceConnection CurveServiceConncetion = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // TODO Auto-generated method stub

        CurveService = ((LocalBinder<Curve>) service).getService();

    }
    @Override
    public void onServiceDisconnected(ComponentName name) {

        // TODO Auto-generated method stub
        CurveService = null;
    }
};

@Override
public synchronized void onResume() {
    super.onResume();
    if(D) Log.e(TAG, "+ ON RESUME +");

}

@Override
public synchronized void onPause() {
    super.onPause();
    if(D) Log.e(TAG, "- ON PAUSE -");
}

@Override
public void onStop() {
    super.onStop();
    if(D) Log.e(TAG, "-- ON STOP --");
}

@Override
public void onDestroy() {
    super.onDestroy();

    if(D) Log.e(TAG, "--- ON DESTROY ---");

    unregisterReceiver(CurveReceiver);
    unbindService(CurveServiceConncetion); 
}
public  void doBind(){
    Boolean tmp;
    tmp = bindService(new Intent(this, Curve.class), CurveServiceConncetion, Context.BIND_AUTO_CREATE);//Context.BIND_AUTO_CREATE

    IntentFilter filter = new IntentFilter(Curve.NEWCURVE_POINT);  
    registerReceiver(CurveReceiver, filter);
}
    public Curve(Unit XUnit, Unit YUnit)
    {           this.Title = "Curve";
        this.finished = false;
        this.XUnit = XUnit;
        this.YUnit = YUnit;
        this.YDirection = CurveDirection.Unspecified;

    }