I'm having difficulty implementing a ResultReceiver on my IntentService class which scans for available devices on the network. (disregarding the terrible design of my code so far) I can't seem to even get my resultReceiver to pass back a test string, the log picks up the instance which I'm sending, but I get a nullPointerException when I try to access the passed in string.
Here are the relevant sections of my Intent Service class:
public class NetHelper extends IntentService{
private ConnectivityManager cm;
private WifiManager manager;
private WifiInfo connectionInfo;
private NetworkInfo activeNetwork;
public Context myContext;
public ResultReceiver receiver;
public Bundle b;
SharedPreferences netprefs;
SharedPreferences.Editor editor;
@Override
protected void onHandleIntent(@Nullable Intent intent) {
//if intent-int == 0: run netsniff
//if intent-int == 1: run getNetInfo
int OPR = intent.getIntExtra("OPR", 0); //0 is default value...
//result receiver for callback use
Bundle params = intent.getExtras();
receiver = params.getParcelable("receiverTag");
b = new Bundle();
//long running operation is netsniff
listDevices = new ArrayList<Devices>();
myContext = getApplicationContext();
//application based storing of values
netprefs = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
editor = netprefs.edit();
cm = (ConnectivityManager) myContext.getSystemService(Context.CONNECTIVITY_SERVICE);
activeNetwork = cm.getActiveNetworkInfo();
manager = (WifiManager) myContext.getSystemService(Context.WIFI_SERVICE);
connectionInfo = manager.getConnectionInfo();
if (OPR == 0) {
try {
netSniff();
} catch (IOException e) {
e.printStackTrace();
Log.d(TAG, e.toString());
}
}
}
snippet from my function which sends a new bundle:
public void netSniff() throws IOException {
Log.d(TAG, "begin sniffing network on network: "+ NET_IP);
Log.d(TAG, "Active Network: " + String.valueOf(activeNetwork));
Log.d(TAG, "IP_ADDR: " + String.valueOf(MYNET_IP));
b.putString("RESULT_RECEIVED", "TESTING23748W3458763298457Y34");
receiver.send(0, b);
myResultReceiver class:
public class myResultReceiver extends ResultReceiver{
private Receiver mReceiver;
public myResultReceiver(Handler handler) {
super(handler);
}
public interface Receiver {
public void onReceiveResult(int resultCode, Bundle resultData);
}
public void setReceiver(Receiver receiver) {
mReceiver = receiver;
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(resultCode, resultData);
}
}
and last, here are my calls for my Fragment:
public class devicesFragment extends Fragment implements myResultReceiver.Receiver {
public myResultReceiver mReceiver;
//discover network info, and get a list of devices
public void launchNetworkSniffer(int opr) {
Intent serviceIntent = new Intent(getActivity(), NetHelper.class);
//setup resultReceiver for service callbacks
mReceiver = new myResultReceiver(new Handler());
mReceiver.setReceiver(this);
serviceIntent.putExtra("receiverTag", mReceiver);
serviceIntent.putExtra("OPR", opr);
getActivity().startService(serviceIntent);
}
//receiver implemented methods
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
Log.d("DATA_RECEIVED******", "processing...");
String newdevjson = resultData.getString("RECEIVED_RESULT");
Log.d("DATA_RECEIVED", newdevjson);
Devices newd = new Gson().fromJson(newdevjson, Devices.class);
devlist.add(newd);
for (Devices i : devlist) {
Log.d("ACTIVE_DEV_COUNT", i.getIp());
}
}
The first log from my fragment's onResultReceived()
is showing but it crashes when I assign the resultData.getString()
with a nullPointerReference.
I believe this fact means I've instantiated everything correctly, so why isn't anything getting passed back at all?