'java.lang.String android.content.Context.getPackageName()' on a null object reference -
my alarmmanager in mainactivity fires every 30 second myreceiver class start getllrd intentservice class. thereafter, sending request onhandleintent method server following getting response. want achieve following, every time alarmmanager fires in mainactivity want pass intent response server in getllrd class map class.
i have tried twice intent's code in getllrd class part intent intent1 = new intent(this, map.class); received intent once in map activity. 1 intent intent1 = new intent(mcontext, map.class); app crashes , got error below. how can achieve purposes?
error:
07-08 13:04:33.482: e/androidruntime(16838): fatal exception: intentservice[intentservice] 07-08 13:04:33.482: e/androidruntime(16838): process: com.bustracker, pid: 16838 07-08 13:04:33.482: e/androidruntime(16838): java.lang.nullpointerexception: attempt invoke virtual method 'java.lang.string android.content.context.getpackagename()' on null object reference 07-08 13:04:33.482: e/androidruntime(16838): @ android.content.componentname.<init>(componentname.java:77) 07-08 13:04:33.482: e/androidruntime(16838): @ android.content.intent.<init>(intent.java:4570) 07-08 13:04:33.482: e/androidruntime(16838): @ com.bustracker.getllrd.onhandleintent(getllrd.java:98) 07-08 13:04:33.482: e/androidruntime(16838): @ android.app.intentservice$servicehandler.handlemessage(intentservice.java:65) 07-08 13:04:33.482: e/androidruntime(16838): @ android.os.handler.dispatchmessage(handler.java:102) 07-08 13:04:33.482: e/androidruntime(16838): @ android.os.looper.loop(looper.java:145) 07-08 13:04:33.482: e/androidruntime(16838): @ android.os.handlerthread.run(handlerthread.java:61) mainactivity:
public class mainactivity extends actionbaractivity{ context context; getlrld.received_mainactvity_context(context); intent intent = new intent(mainactivity.this, intentreceiver.class); intent.putextra("json_data", json); pendingintent pendingintent = pendingintent.getbroadcast( getapplicationcontext(), 1, intent, pendingintent.flag_update_current); alarmmanager alarm = (alarmmanager) getsystemservice(context.alarm_service); calendar cal = calendar.getinstance(); alarm.setrepeating(alarmmanager.rtc_wakeup, system.currenttimemillis(), 30 * 1000, pendingintent); startservice(intent); } myreceiver class:
public class myreceiver extends broadcastreceiver { @override public void onreceive(context context, intent intent) { try { string action = intent.getstringextra("json_data"); if (!action.isempty()) { startservice(context, action); } } catch (exception e) { } } public void startservice(context context, string action) { intent inetent = new intent(context, getllrd.class); inetent.putextra("json_data", action); context.startservice(inetent); } } getllrd class:
public class getllrd extends intentservice { context mcontext; public getllrd() { super("intentservice"); } public void received_mainactvity_context(context context){ this.mcontext = context; } @override protected void onhandleintent(intent intent) { string jsonstring = intent.getstringextra("json_data"); if (jsonstring != null) { //so if try in way receiving data intent once in map activity. intent intent1 = new intent(this, map.class); intent1.putextra("list_data", data); intent1.addflags(intent.flag_activity_new_task); startactivity(intent1); //when in way getting error above: intent intent1 = new intent(mcontext, map.class); intent1.putextra("list_data", data); intent1.addflags(intent.flag_activity_new_task); mcontext.startactivity(intent1); } } } map activity:
public class map extends actionbaractivity{ @override protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); intent intent = getintent(); @suppresswarnings("unchecked") arraylist<itemdto> list =(arraylist<itemdto>) intent.getserializableextra("list_data"); (itemdto itemdto : list) { double latitude = itemdto.getlatitude(); double longitude = itemdto.getlongitude(); int route = itemdto.getroute(); string direction = itemdto.getdirection(); system.out.println("test map activity: " + latitude + ", " + longitude + ", " + ", " + route + ", " + direction); } } } edit:
getllrd intentservice class:
if (data != null && !data.isempty()) { intent localintent = new intent( constants.broadcast_action).putextra( "data_list", data); localbroadcastmanager.getinstance(this).sendbroadcast(localintent); } inside map activity:
oncraete(bundle savedinstancestate){ intentfilter data_filter = new intentfilter(); data_filter.addaction(constants.broadcast_action); registerreceiver(data_receiver, data_filter); } final broadcastreceiver data_receiver = new broadcastreceiver() { @override public void onreceive(context context, intent intent) { @suppresswarnings("unchecked") arraylist<itemdto> list = (arraylist<itemdto>) intent .getserializableextra("list_data"); (itemdto itemdto : list) { double latitude = itemdto.getlatitude(); double longitude = itemdto.getlongitude(); int route = itemdto.getroute(); string direction = itemdto.getdirection(); system.out.println("test apple activity: " + latitude + ", " + longitude + ", " + ", " + route + ", " + direction); } } };
your architecture flawed. intentservice created when call startservice(). oncreate() , onhandleintent() called in service. upon completion of onhandleintent(), if there no other pending intents processed service stops.
you making call in mainactivity before call startservice():
getlrld.received_mainactvity_context(context); you don't show how setting reference variable getlrld, isn't going work. service isn't created until call startservice().
you trying establish communcations channel between service , activity. however, using intentservice non-persistent service. gets created needed , when has nothing goes away. therefore cannot pass reference service activity, , should not pass reference activity service.
the best way achieve communication between service , activity 1 of following:
service sends broadcast
intentdata. activity can register broadcastrecevier listen this.activity creates
pendingintentcontaining necessary action, component, etc. , passes service "extra" inintentuses when callingstartservice(). service callssend()onpendingintentin order return data activity.
in both cases service doesn't need know activity, , activity doesn't need reference service.
edit: add code start activity
if want start activity, can in service.onhandleintent():
intent intent1 = new intent(this, map.class); intent1.putextra("list_data", data); intent1.addflags(intent.flag_activity_new_task | intent.flag_activity_single_top); startactivity(intent1); using intent.flag_activity_single_top prevent android launching new instance of activity, if there instance of activity running. in case activity running, can "extras" intent overriding onnewintent() in activity.
if use approach don't need use broadcast intent send data service activity.
Comments
Post a Comment