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

Popular posts from this blog

get url and add instance to a model with prefilled foreign key :django admin -

android - Keyboard hides my half of edit-text and button below it even in scroll view -

css - Make div keyboard-scrollable in jQuery Mobile? -