尝试从不同的类到达对象时遇到问题。我在一个Android项目上,我从我的MainActivity类中完成了一个扩展Activity的套接字连接。然后我创建了另一个名为SmsReceiver的类,它扩展了BroadcastReceiver,因此我可以获得发送到我的手机(模拟器)的消息。现在我需要SmsReceiver类来使用MainActivity类中的outputstream对象,但我不知道如何到达它。我无法创建MainActivity的新实例。
我可以以某种方式将outputstream对象发送到SmsReceiver类吗? 我希望你们中的一些人能得到一些提示,提前谢谢!
好的,现在我已经选择了接口解决方案,但我又被卡住了!
以下是我的课程:
MainActivity:
public class MainActivity extends Activity implements MainInterface
{
try {
out = new PrintWriter(clientSocket.getOutputStream());
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
} catch (IOException ex) {
System.err.println("Error in creating Streams:" + ex.toString());
return;
}
public PrintWriter getOutputStream() {
return out;
}
}
MainInterface:
public interface MainInterface {
public PrintWriter getOutputStream();
}
SmsReceiver:
public class SmsReceiver extends BroadcastReceiver{
MainInterface mainInterface = new MainActivity(); ///// <------
PrintWriter out; //// <--------
@Override
public void onReceive(Context context, Intent intent) {
mainInterface.getOutputStream(); ////// <------------
// Retrieves a map of extended data from the intent.
final Bundle bundle = intent.getExtras();
try {
if(bundle != null){
final Object[] pdusObj = (Object[]) bundle.get("pdus");
for(int i = 0; i < pdusObj.length; i++){
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String senderNum = phoneNumber;
String message = currentMessage.getDisplayMessageBody();
Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + message);
out.println("senderNum: "+ senderNum + "; message: " + message);
out.flush(); /// these two lines
}
}
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}
}
由于某种原因,我通过界面获得的PrintWriter是 null ,以及桌面上的输入流(这是在执行 out.println()时应该接收消息的程序)甚至没有收到消息,它只是在 in.readLine()中被阻止。 我是以错误的方式实例化界面还是正在发生什么?
logcat错误打印是: 09-15 14:13:55.880:E / SmsReceiver(1361):异常smsReceiverjava.lang.NullPointerException
答案 0 :(得分:0)
您必须在MainActivity中设置BroadcastReceiver类的意图,为什么不使用此BroadcastReceiver的意图发送数据,这比我在看到您的代码之前提出的方法要容易得多。
您将根据广播接收器的意图收到的数据,请检查此解决方案是否有效。 但是,您需要找到一种通过意图发送PrintWriter对象的方法。
另一种解决方案可以是使用和观察者和订阅者模式,你可以在网上找到多个相同的例子。