i have implemented gridview in android.
the first fragment use asynctask load file , show on gridview. when getview has been call. call extractthumbnail read thumbnail. works fine.
and can turn second fragment via button.
i click button , turn second fragment , when extractthumbnail reading thumbnail of video , photo. crashes due java.lang.nullpointerexception.
the code of first fragment following:(i have omitted code not important)
public class localfilebrowserfragment extends fragment implements multichoicemodelistener{ public static executor threadpoolexecutor; public static activity activity; @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { mfilelistadapter = new localfilelistadapter(inflater, mfilelist) ; mfilelistadapter.gridadapter(getactivity()); activity = getactivity(); loadfilelisttask = new loadfilelisttask(); new loadfilelisttask().executeonexecutor(threadpoolexecutor) ; backbutton = (imagebutton) view.findviewbyid(r.id.backbutton); backbutton.setonclicklistener(new button.onclicklistener() { @override public void onclick(view v) { loadfilelisttask.cancel(true); checkurl task = new checkurl(activity, localfilebrowserfragment.this); task.execute(); } }); } public class localfilelistadapter extends baseadapter { private layoutinflater minflater ; private arraylist<filenode> mfilelist ; private static final string tag = "localfilebrowserfragment" ; private context mcontext; public localfilelistadapter(layoutinflater inflater, arraylist<filenode> filelist) { minflater = inflater ; mfilelist = filelist ; } public void gridadapter(context ctx) { // todo auto-generated method stub mcontext = ctx; } private list<extractthumbnail> thumbnailtasklist = new linkedlist<extractthumbnail>(); private class extractthumbnail extends asynctask<viewtag, integer, bitmap> { //read thumbnail. viewtag mviewtag; @override protected void onpreexecute() { thumbnailtasklist.add(this); super.onpreexecute(); } @override protected bitmap doinbackground(viewtag... params) { mviewtag = params[0]; bitmapfactory.options options = new bitmapfactory.options(); options.injustdecodebounds = true; options.indither = false; options.inscaled = false; bitmapfactory.decodefile(mviewtag.mfilenode.mname, options); int imageheight = options.outheight; int imagewidth = options.outwidth; int requestedheight = 64; int requestedwidth = 64; int scaledownfactor = 0; options.injustdecodebounds = false; while (true) { scaledownfactor++; if (imageheight / scaledownfactor <= requestedheight || imagewidth / scaledownfactor <= requestedwidth) { scaledownfactor--; break; } } options.insamplesize = scaledownfactor; options.inpreferredconfig = bitmap.config.argb_8888; float scalefactor = (float) requestedheight / imageheight; scalefactor = math.max(scalefactor, (float) requestedwidth / imagewidth); bitmap originalbitmap = bitmapfactory.decodefile( mviewtag.mfilenode.mname, options); if (originalbitmap == null) { try { byte[] data = util.getlibvlcinstance().getthumbnail( "file://" + mviewtag.mfilenode.mname, requestedwidth, requestedheight); if (data != null) { bitmap thumbnail = bitmap.createbitmap(requestedwidth, requestedheight, bitmap.config.argb_8888); thumbnail.copypixelsfrombuffer(bytebuffer.wrap(data)); thumbnail = util.cropborders(thumbnail, requestedwidth, requestedheight); return thumbnail; } } catch (libvlcexception e) { // todo auto-generated catch block e.printstacktrace(); } return null; } bitmap thumbnail = thumbnailutils.extractthumbnail(originalbitmap, requestedwidth, requestedheight); originalbitmap.recycle(); return thumbnail; } @override protected void onpostexecute(bitmap thumbnail) { log.i(tag, "thumbnail = " + thumbnail); if (thumbnail != null) { mviewtag.mthumbnail.setimagebitmap(thumbnail); } thumbnailtasklist.remove(this); mviewtag.mthumbnailtask = null; super.onpostexecute(thumbnail); } } @override public view getview(int position, view convertview, viewgroup parent) { viewtag viewtag ; if (convertview == null) { convertview = minflater.inflate(r.layout.filelist_row, null) ; viewtag = new viewtag(mcontext , (imageview) convertview.findviewbyid(r.id.filelistthumbnail); convertview.settag(viewtag) ; } //read thumbnail. viewtag.mthumbnailtask = new extractthumbnail() ; viewtag.mthumbnailtask.executeonexecutor(asynctask.serial_executor, viewtag) ; return convertview ; } } and create class , when click button @ first , call checkurl task = new checkurl(activity, localfilebrowserfragment.this);.
the code of checkurl class following(i have omitted code not important):
public class checkurl extends asynctask<url, integer, string>{ context context; fragment current_frag; public checkurl(context contextin , fragment frag) { context = contextin; current_frag = frag; // current_frag.getactivity here not null } @override protected string doinbackground(url... params) { // todo auto-generated method stub url url = cameracommand.commandqueryav1url() ; if (url != null) { return cameracommand.sendrequest(url) ; } return null ; } @override protected void onpreexecute() { // todo auto-generated method stub super.onpreexecute(); } @override protected void onpostexecute(string result) { // todo auto-generated method stub fragment newfragment = streamplayerfragment.newinstance(livestreamurl) ; fragmentmanager fragmentmanager = current_frag.getactivity().getfragmentmanager() ; // current_frag.getactivity here null. crash here. if (fragmentmanager.getbackstackentrycount() > 0) { fragmentmanager.backstackentry backentry = fragmentmanager.getbackstackentryat(fragmentmanager .getbackstackentrycount() - 1) ; if (backentry != null && backentry.getname().equals(newfragment.getclass().getname())) return ; } fragmenttransaction fragmenttransaction = fragmentmanager.begintransaction() ; fragmenttransaction .setcustomanimations(r.anim.right_in, r.anim.right_out, r.anim.left_in, r.anim.left_out) .replace(r.id.mainmainfragmentlayout, newfragment) .addtobackstack(newfragment.getclass().getname()).commit() ; fragmentmanager.executependingtransactions() ; super.onpostexecute(result) ; } } when extractthumbnail asynctask reading thumbnail , not reading finish. click button turn second fragment.
it call checkurl task = new checkurl(activity, localfilebrowserfragment.this);.
but crash @ fragmentmanager fragmentmanager = originalfragment.getactivity().getfragmentmanager(); in checkurl class.
i try print originalfragment.getactivity() in log. show originalfragment.getactivity() null.
why originalfragment.getactivity() null ?
thanks in advance.
your asynctask should this:
activity context; public checkurl(activity contextin){ context = contextin; } protected void onpostexecute(string result) { //etc fragmentmanager fragmentmanager = context.getfragmentmanager() ; } your calling originalfragment.getactivity() null because fragment detached activity (and switch new fragment) when task in background.
also, not depend on current fragment in asynctask because may destroyed when move new fragment (it may cause nullpointerexception)
Comments
Post a Comment