Java Android:对另一个类中活动对象的引用变为NULL
我试图做的是将对mainactivity的引用传递给另一个类并使用它 当我第一次传递引用时,它不是null。但后来,当我在事件处理程序中使用它时,它变为null 代码如下:Java Android:对另一个类中活动对象的引用变为NULL,java,android,android-intent,Java,Android,Android Intent,我试图做的是将对mainactivity的引用传递给另一个类并使用它 当我第一次传递引用时,它不是null。但后来,当我在事件处理程序中使用它时,它变为null 代码如下: public class MainActivity extends MapActivity implements SmsReceivedListener { SmsReceiver smsreceiver = new SmsReceiver(); /** Called when the activity i
public class MainActivity extends MapActivity implements SmsReceivedListener {
SmsReceiver smsreceiver = new SmsReceiver();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
smsreceiver.setSmsReceivedListener(this);
}
public void drawme() {
// do smth
}
@Override
public void onSmsReceived(String id, String lon, String lat) {
Toast.makeText(this, "SMS delivered", Toast.LENGTH_LONG).show();
}
}
我获得参考的另一类:
public class SmsReceiver extends BroadcastReceiver {
private SmsReceivedListener listener;
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@SuppressLint("NewApi")
@Override
public void onReceive(final Context context, final Intent intent) {
// Here it is NULL
if(listener!=null)
listener().onSmsReceived(carNumber, lon,lat);
}
public void setSmsReceivedListener(SmsReceivedListener mainActivity) {
//It is no null when I first set the object here
listener = (mainActivity);
}
}
只有当您
- 将其设置为null
- 以一种非线程安全的方式使用它,并且您正在读取与设置不同的线程
- 您使用的是相同的字段,但在不同的对象中
建议:在活动中注册接收者,而不是在清单中注册。如何注册sms接收者?此代码甚至无法编译!您省略了类代码的基本部分,因此我们只能猜测。使用引用的原因是什么??如果您在自己的构造函数中注册SMSReceiver,它将在设置侦听器之前很久注册。是的,我在清单中注册了它。所以你的意思是我应该做以下事情:SmsReceiver SmsReceiver=新的SmsReceiver;IntentFilter=newintentfilter(“android.provider.Telephony.SMS_RECEIVED”);寄存器接收器(SMS接收器、过滤器);为了进一步阐述这个答案,在大多数情况下,您不希望将活动的特定实例绑定到广播接收器。正确的方法是,只允许BroadcastReceiver在活动打开时工作。不正确的方式可能会使它仍然工作,但您可能会面临内存泄漏和看似随机的异常的风险。如果您希望BroadcastReceiver始终处于活动状态,就像您在清单中注册它时一样。您应该继续在清单中注册它。但是处理您的活动需要通过另一个专门用于从SMSReceiver到您的活动进行通信的广播接收器来完成。我会广播一个新的意图,声明您刚刚收到一条新的短信,如果没有任何内容捕捉到该状态意图,您可以启动活动将其带到前台。如果您能让我们更好地了解正在发生的事情,我们可能会更好地告诉您哪种方法更适合。@Mikedge:关于评论的最后一部分,可以使用由BR启动的单任务活动来实现,该活动将启动或接收onNewIntent。@njzk2 google point。如果我们对用例有更多的了解,那么帮助他实现正确的实现就会容易得多。