android - I get NullPointerException when my app hasn't been open for a while -
i have simple weather app consists of view pager 3 fragments (current, hourly , daily weather forecast). when launch app first time works fine close , open it. however, have noticed when app has been in background processes while , open it, crashes exception:
java.lang.nullpointerexception: attempt read field 'koemdzhiev.com.stormy.weather.forecast koemdzhiev.com.stormy.ui.mainactivity.mforecast' on null object reference @ koemdzhiev.com.stormy.ui.current_forecast_fragment.updatedisplay(current_forecast_fragment.java:120) @ koemdzhiev.com.stormy.ui.mainactivity$3$3.run(mainactivity.java:234) @ android.os.handler.handlecallback(handler.java:739) @ android.os.handler.dispatchmessage(handler.java:95) @ android.os.looper.loop(looper.java:135) @ android.app.activitythread.main(activitythread.java:5294) @ java.lang.reflect.method.invoke(native method) @ java.lang.reflect.method.invoke(method.java:372) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:904) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:699) i suspect exception has fact not saving data using saveinstance method. current fragment code:
public class current_forecast_fragment extends fragment { private static final string tag = "mainactivity"; private mainactivity mactivity; textview mtimelabel; textview mtemperaturelabel; textview mhumidityvalue; textview mprecipvalue; textview msummarylabel; textview mlocationlabel; textview mwindspeedvalue; textview mfeelslike; imageview miconimageview; imageview mdegreeimageview; public swiperefreshlayout mswiperefreshlayout; @override public void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); mactivity = ((mainactivity) getactivity()); } @override public view oncreateview(layoutinflater inflater, @nullable viewgroup container, @nullable bundle savedinstancestate) { view v = inflater.inflate(r.layout.current_forefast_fragment, container, false); mtimelabel = (textview)v.findviewbyid(r.id.timelabel); mtemperaturelabel = (textview)v.findviewbyid(r.id.temperaturelabel); mhumidityvalue = (textview)v.findviewbyid(r.id.humidityvalue); mprecipvalue = (textview)v.findviewbyid(r.id.precipvalue); msummarylabel = (textview)v.findviewbyid(r.id.summarylabel); mlocationlabel = (textview)v.findviewbyid(r.id.locationlabel); mwindspeedvalue = (textview)v.findviewbyid(r.id.windspeedvalue); mfeelslike = (textview)v.findviewbyid(r.id.feels_like_label); miconimageview = (imageview)v.findviewbyid(r.id.iconimageview); mdegreeimageview = (imageview)v.findviewbyid(r.id.degreeimageview); mswiperefreshlayout = (swiperefreshlayout)v.findviewbyid(r.id.current_swipe_refresh_layout); mswiperefreshlayout.setcolorschemeresources(r.color.orange, r.color.blue, r.color.green); mswiperefreshlayout.setonrefreshlistener(new swiperefreshlayout.onrefreshlistener() { @override public void onrefresh() { log.d("tag", "swiping in current!"); //if there internet , if mswiperefreshlayout in hourly , daily fragments not running... if (mactivity.isnetworkavailable()) { if (!mactivity.mhourly_forecast_fragment.mswiperefreshlayout.isrefreshing() && !mactivity.mdaily_forecast_fragment.mswiperefreshlayout.isrefreshing()) { if (mactivity.islocationservicesenabled()) { if (mactivity.latitude != 0.0 && mactivity.longitude != 0.0) { mactivity.getforecast(mactivity.latitude, mactivity.longitude); } else { mactivity.getlocation(); } }else{ mactivity.alertfornolocationenabled(); } }else{ mswiperefreshlayout.setrefreshing(false); toast.maketext(mactivity, "currently refreshing...", toast.length_short).show(); } } else { toast.maketext(mactivity, "no internet connection!", toast.length_long).show(); mswiperefreshlayout.setrefreshing(false); } } }); //start swipe refresh layout on start internet available if(mactivity.isnetworkavailable()) mswiperefreshlayout.post(new runnable() { @override public void run() { mswiperefreshlayout.setrefreshing(true); log.d("tag","running swiping..."); } }); return v; } public void updatedisplay() { if(mactivity.mforecast != null) { current current = mactivity.mforecast.getcurrent(); //setting current weather details ui mtemperaturelabel.settext(current.gettemperature() + ""); mtimelabel.settext("at " + current.getformattedtime() + " is"); mhumidityvalue.settext(current.gethumidity() + "%"); mprecipvalue.settext(current.getprecipchange() + "%"); msummarylabel.settext(current.getsummery()); mwindspeedvalue.settext(current.getwindspeed() + ""); mfeelslike.settext("feels like: " + current.getfeelslike()); mlocationlabel.settext(mactivity.locationname); drawable drawable = contextcompat.getdrawable(mactivity, current.geticonid()); miconimageview.setimagedrawable(drawable); }else{ toast.maketext(getactivity(),"could not update data @ time! please, try again.",toast.length_long).show(); } } } fragment page adapter code:
public class viewpageradapter extends fragmentstatepageradapter { private current_forecast_fragment mcurrent_forecast_fragment; private hourly_forecast_fragment mhourly_forecast_fragment; private daily_forecast_fragment mdaily_forecast_fragment; charsequence titles[]; // store titles of tabs going passed when viewpageradapter created int numboftabs; // store number of tabs, passed when viewpageradapter created // build constructor , assign passed values appropriate values in class public viewpageradapter(fragmentmanager fm,charsequence mtitles[], int mnumboftabsumb,current_forecast_fragment current_fragment, hourly_forecast_fragment hourly_fragment, daily_forecast_fragment daily_fragment) { super(fm); this.mcurrent_forecast_fragment = current_fragment; this.mhourly_forecast_fragment = hourly_fragment; this.mdaily_forecast_fragment = daily_fragment; this.titles = mtitles; this.numboftabs = mnumboftabsumb; } //this method return fragment every position in view pager @override public fragment getitem(int position) { if(position == 0) // if position 0 returning first tab { return this.mcurrent_forecast_fragment; } else if (position == 1) // having 2 tabs if position 0 must 1 returning second tab { return this.mhourly_forecast_fragment; }else { return this.mdaily_forecast_fragment; } } // method return titles tabs in tab strip @override public charsequence getpagetitle(int position) { return titles[position]; } // method return number of tabs tabs strip @override public int getcount() { return numboftabs; } } my main activity code:
public class mainactivity extends appcompatactivity { ... @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); this.mcurrent_forecast_fragment = new current_forecast_fragment(); this.mhourly_forecast_fragment = new hourly_forecast_fragment(); this.mdaily_forecast_fragment = new daily_forecast_fragment(); // creating viewpageradapter , passing fragment manager, titles fot tabs , number of tabs. adapter = new viewpageradapter(getsupportfragmentmanager(), titles, numboftabs, mcurrent_forecast_fragment, mhourly_forecast_fragment, mdaily_forecast_fragment); // assigning viewpager view , setting adapter pager = (viewpager) findviewbyid(r.id.pager); pager.setoffscreenpagelimit(3); pager.setadapter(adapter); // assiging sliding tab layout view tabs = (slidingtablayout) findviewbyid(r.id.tabs); tabs.setdistributeevenly(true); // make tabs fixed set true, makes tabs space evenly in available width // setting custom color scroll bar indicator of tab view tabs.setcustomtabcolorizer(new slidingtablayout.tabcolorizer() { @override public int getindicatorcolor(int position) { return contextcompat.getcolor(mainactivity.this, r.color.tabsscrollcolor); } }); // setting viewpager slidingtabslayout tabs.setviewpager(pager); } i have method in mainactivity updates data in fragments:
public void getforecast(double latitude, double longitude) { //scedule no response server task... mscheduledfuture = exec.schedule(mnotabletogetweatherdatatask,12, timeunit.seconds); log.d(tag, "getforecast initiated..."); string api_key = "3ed3a1906736c6f6c467606bd1f91e2c"; string forecast = "https://api.forecast.io/forecast/" + api_key + "/" + latitude + "," + longitude + "?units=si"; if (isnetworkavailable()) { okhttpclient client = new okhttpclient(); request request = new request.builder() .url(forecast) .build(); call call = client.newcall(request); call.enqueue(new callback() { @override public void onfailure(request request, ioexception e) { runonuithread(new runnable() { @override public void run() { toggleswiperefreshlayoutsoff(); } }); @override public void onresponse(response response) throws ioexception { runonuithread(new runnable() { @override public void run() { toggleswiperefreshlayoutsoff(); } }); try { string jsondata = response.body().string(); if (response.issuccessful()) { mforecast = parseforecastdetails(jsondata); runonuithread(new runnable() { @override public void run() { log.d(tag, "issuccessful - run on uni threth (update display)..."); //this line bellow causes npe... mcurrent_forecast_fragment.updatedisplay(); mhourly_forecast_fragment.setuphourlyfragment(); mdaily_forecast_fragment.setupdailyfragment(); toggleswiperefreshlayoutsoff(); //set isfirsttime true next refresh wont location isfirsttimelaunchingtheapp = false; } }); } else { alertuserabouterror(); } } catch (ioexception | jsonexception e) { log.e(tag, "exception caught:", e); } }
is because mactivity null.
add line in onresume() method
mactivity = ((mainactivity) getactivity()); like this
@override public void onresume() { super.onresume(); mactivity = ((mainactivity) getactivity()); }
Comments
Post a Comment