2015-05-09 46 views
0

這應該非常簡單,我真的不確定發生了什麼問題。我創建了一個基本上接收消息的java類,然後將它們提供給我的MainActivity。當onReceive()函數觸發時,應用程序崩潰,因爲它有問題將數據發送回MainActivity。它一直在Zout()上撥打NullPointerException致電onReceive()簡單的MainActivity和BroadcastReceiver派生類通信問題

這裏是SmsReceiver類:

package ...; //you don't need to see my dumb package name. 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.SmsMessage; 
import android.util.Log; 
import android.widget.Toast; 
import java.util.ArrayList; 

public class SmsReceiver extends BroadcastReceiver { 
    ArrayList<String> phoneNumbers; 
    ArrayList<String> textMessages; 
    private Activity mainAct; //our reference to MainActivity 

    //very simple constructor 
    public SmsReceiver() { 

    } 

    //this function is called in onCreate() in MainActivity to provide reference to MainActivity 
    public void SetSMSReceiverActivity(Activity a){ 
     mainAct = a; 
     //talk to our main activity 
     MainActivity mainComm = (MainActivity)mainAct; 
     mainComm.Zout("SMSReceiver initialized bro"); //this works just fine 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //THIS IS WHAT CAUSES ISSUES! This call to MainActivity does NOT work for whatever reason. Rude. 
     MainActivity mainComm = (MainActivity)mainAct; 
     mainComm.Zout("This message won't send"); //this does NOT work fine for whatever reason. Throws NullPointerException. 

     //...more code down here that actually works! 
    } 
} 

功能Zout()MainActivity是一個簡單的打印到TextView進行調試。我將使用MainActivity中的函數來接收數據,一旦onReceive()停止情緒波動。

對不起,如果這是一個愚蠢的問題。我沒有用Java編程幾年,而且我很生疏。我不知道爲什麼這不起作用。我會拋出+ 1的誰可以幫助!

+0

有幾種不同的方法可以解決這個問題。 1)使用接口來促進通信2)在活動中使用靜態方法3)在活動中使用單獨的BroadcastReceiver,以便SmsReceiver在接收廣播時向其廣播。這裏有一些很好的答案:http://stackoverflow.com/questions/4132425/android-communication-between-broadcast-receiver-and-mainactivity-send-data-to –

+0

謝謝@DanielNugent!我現在要研究一些其他形式的交流。有沒有解釋爲什麼對MainActivity的函數調用在一個函數中工作,而不是在另一個函數中工作?我很困惑:s。 – blagh

回答

0

我相信這是因爲你還沒有初始化mainAct變量。

爲的onCreate(){} 你做初始化

mainAct = a; 

但不適合的onReceive。

+0

感謝您的迴應!我在調用onReceive之前,在SetSMSReceiverActivity()中設置了全局變量mainAct。我確定在onReceive()中獲取對MainActivity的引用有一個更好的方法,但我不確定那是什麼。我看到調試消息「SMSReceiver初始化兄弟」,但是當onReceive激發時,我仍然得到一個NullPointerException異常:(。 – blagh

+0

我相信你必須在onReceive()方法內使用SetSMSReceiverActivity(Activity a)方法來設置mainAct的值 我相信只是有一個setter方法不會讓你實際設置的值... 你可以只內的onReceive設置爲: mainAct =(A想要類) 檢查,如果是這樣的原因, ...如果這樣做,那麼可能是你必須在onReceive方法中調用setter – qrian3