android - Why the fragment.getActivity() is null after send fragment to other class? -


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