android - AsyncTaskLoader not initialized after screen rotation -


i using recyclerview getting data adapter gets data trough asynctaskloader. runs fine until rotate screen portrait landscape. @ point nullpointer exception when using .forceload(); on asynctaskloader have absolutelly no idea why fileloader null when same oncreate method called regardless of orientation , works on portrait , doesnt on landscape.

here code:

package sk.tomus.filescoper;  import android.content.activitynotfoundexception; import android.content.intent; import android.content.sharedpreferences; import android.net.uri; import android.preference.preferencemanager; import android.support.v4.app.loadermanager; import android.support.v4.content.loader; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.support.v7.widget.gridlayoutmanager; import android.support.v7.widget.linearlayoutmanager; import android.support.v7.widget.recyclerview; import android.util.log; import android.view.view; import android.widget.toast;  import java.io.file; import java.util.arraylist; mport java.util.list;  public class mainactivity extends appcompatactivity implements loadermanager.loadercallbacks<list<file>> {  private android.support.v4.content.asynctaskloader<list<file>> fileloader; private directorymanager directorymanager; private recyclerview recyclerview; private filerecycleradapter recycleradapter; private recyclerview.layoutmanager layoutmanager; private boolean islandscape;  @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_main);     getsupportactionbar().setdisplayhomeasupenabled(true);     sharedpreferences prefs = preferencemanager.getdefaultsharedpreferences(this);     directorymanager = new directorymanager(prefs.getstring("preference_edit_def_folder", "/"));      recyclerview = (recyclerview) findviewbyid(r.id.recycler_view);      islandscape = getresources().getboolean(r.bool.islandscape);     if (islandscape) {         layoutmanager = new gridlayoutmanager(this, 4);     } else {         layoutmanager = new linearlayoutmanager(this);     }     recyclerview.setlayoutmanager(layoutmanager);     recycleradapter = new filerecycleradapter(new arraylist<file>());     getsupportloadermanager().initloader(0, null, this);     //below line 51 code crashes     fileloader.forceload();     recyclerview.setadapter(recycleradapter);  }  @override protected void onresume() {     super.onresume();     recycleradapter.setonitemclicklistener(new filerecycleradapter.myclicklistener() {         @override         public void onitemclick(int position, view v) {             log.i("log", " clicked on item " + position);         }     }); }  private void onfileclicked(file file) {     if (file.isdirectory()) {         log.i("opening directory", file.getabsolutepath());         if (!file.canread()) {             toast.maketext(getapplicationcontext(), "inaccessible", toast.length_short).show();             return;         }         directorymanager.setpreviousdir(directorymanager.getcurrentdir());         directorymanager.setcurrentdir(file);          if (fileloader.isstarted()) {             fileloader.oncontentchanged();         }     } else {         openfile(uri.fromfile(file));     } }  private void openfile(uri fileuri) {     string mimetype = directorymanager.getmimetype(fileuri);      if (mimetype != null) {         try {             intent = new intent(intent.action_view);             i.setdataandtype(fileuri, mimetype);             startactivity(i);         } catch (activitynotfoundexception e) {             toast.maketext(this, "file type recognized, no apps open it", toast.length_long).show();         }     } else {         toast.maketext(this, "unknown file type", toast.length_long).show();     } }  @override public loader<list<file>> oncreateloader(int i, bundle bundle) {     fileloader = new android.support.v4.content.asynctaskloader<list<file>>(this) {         @override         public list<file> loadinbackground() {             log.i("loader loading:", directorymanager.getcurrentdir().tostring());             return directorymanager.getallfiles(directorymanager.getcurrentdir());         }     };     return fileloader; }  @override public void onloadfinished(loader<list<file>> loader, list<file> data) {     recycleradapter.setfiles(data); }  @override public void onloaderreset(loader<list<file>> loader) { } } 

here stacktrace:

08-29 00:50:21.176 16411-16411/sk.tomus.filescoper e/androidruntime: fatal exception: main                                                                  process: sk.tomus.filescoper, pid: 16411                                                                  java.lang.runtimeexception: unable start activity componentinfo{sk.tomus.filescoper/sk.tomus.filescoper.mainactivity}: java.lang.nullpointerexception: attempt invoke virtual method 'void android.support.v4.content.asynctaskloader.forceload()' on null object reference                                                                      @ android.app.activitythread.performlaunchactivity(activitythread.java:2379)                                                                      @ android.app.activitythread.handlelaunchactivity(activitythread.java:2442)                                                                      @ android.app.activitythread.handlerelaunchactivity(activitythread.java:4053)                                                                      @ android.app.activitythread.access$900(activitythread.java:156)                                                                      @ android.app.activitythread$h.handlemessage(activitythread.java:1357)                                                                      @ android.os.handler.dispatchmessage(handler.java:102)                                                                      @ android.os.looper.loop(looper.java:211)                                                                      @ android.app.activitythread.main(activitythread.java:5389)                                                                      @ java.lang.reflect.method.invoke(native method)                                                                      @ java.lang.reflect.method.invoke(method.java:372)                                                                      @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1020)                                                                      @ com.android.internal.os.zygoteinit.main(zygoteinit.java:815)                                                                   caused by: java.lang.nullpointerexception: attempt invoke virtual method 'void android.support.v4.content.asynctaskloader.forceload()' on null object reference                                                                      @ sk.tomus.filescoper.mainactivity.oncreate(mainactivity.java:51)                                                                      @ android.app.activity.performcreate(activity.java:5990)                                                                      @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1106)                                                                      @ android.app.activitythread.performlaunchactivity(activitythread.java:2332)                                                                      @ android.app.activitythread.handlelaunchactivity(activitythread.java:2442)                                                                       @ android.app.activitythread.handlerelaunchactivity(activitythread.java:4053)                                                                       @ android.app.activitythread.access$900(activitythread.java:156)                                                                       @ android.app.activitythread$h.handlemessage(activitythread.java:1357)                                                                       @ android.os.handler.dispatchmessage(handler.java:102)                                                                       @ android.os.looper.loop(looper.java:211)                                                                       @ android.app.activitythread.main(activitythread.java:5389)                                                                       @ java.lang.reflect.method.invoke(native method)                                                                       @ java.lang.reflect.method.invoke(method.java:372)                                                                       @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1020)                                                                       @ com.android.internal.os.zygoteinit.main(zygoteinit.java:815)  

thanks in advance help

you shouldn't calling forceload() in oncreate() method @ - won't created until oncreateloader() called (which after oncreate() finishes).

as per making loading data lifecycle aware blog post, should instead calling forceload() in asynctaskloader's onstartloading method. ensures loader created , ready start loading before call forceload().

fileloader = new android.support.v4.content.asynctaskloader<list<file>>(this) {     @override     public void onstartloading() {       forceload();     }      @override     public list<file> loadinbackground() {         log.i("loader loading:", directorymanager.getcurrentdir().tostring());         return directorymanager.getallfiles(directorymanager.getcurrentdir());     } }; 

Comments

Popular posts from this blog

amazon web services - S3 Pre-signed POST validate file type? -

c# - Check Keyboard Input Winforms -