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