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
Post a Comment