Android如何阻塞一个线程让其等待一个时间发生之后再继续执行?
【背景】我创建了几个Fragment,里面有一些TextView代表一些信息。现在有一个异步线程AsyncTask从网络上获取信息,并在获取之后通过回调机制(Fragme...
【背景】我创建了几个Fragment,里面有一些TextView代表一些信息。现在有一个异步线程AsyncTask从网络上获取信息,并在获取之后通过回调机制(Fragment里实现了一个Interface,这个Interface实例化的方法onInformationGot()会调用Fragment里的setTextView())来更新Fragment里的这些信息。
【问题】但现在出现一个问题:从网络获取信息完毕的时间先于Fragment调用onCreateView()的时间,也就是说,当回调执行onInformationGot()(从而调用setTextView()来设置Fragment信息)时,那些TextView还没有实例化(TextView们是在onCreateView()中通过rootView.findViewById()实例化的)。于是在setTextView()时会出现NullPointerException。
【求解答】现在我希望达到这样的效果:让异步线程AsyncTask获取完网络信息正要回调更新Fragment时让它暂停,等待Fragment执行了onCreateView()之后再唤醒它让它执行fragmentInterface.onInformationGot()方法来更新Fragment。
请给位大神指教!多谢! 展开
【问题】但现在出现一个问题:从网络获取信息完毕的时间先于Fragment调用onCreateView()的时间,也就是说,当回调执行onInformationGot()(从而调用setTextView()来设置Fragment信息)时,那些TextView还没有实例化(TextView们是在onCreateView()中通过rootView.findViewById()实例化的)。于是在setTextView()时会出现NullPointerException。
【求解答】现在我希望达到这样的效果:让异步线程AsyncTask获取完网络信息正要回调更新Fragment时让它暂停,等待Fragment执行了onCreateView()之后再唤醒它让它执行fragmentInterface.onInformationGot()方法来更新Fragment。
请给位大神指教!多谢! 展开
3个回答
展开全部
你所谓的线程阻塞是指的ui线程吗?这应该是从你在开发的经验以及测试当中去体验的,如果你说是用代码去判断线程阻塞的话,估计比较复杂,也没那个必要,android的机制在出现ui线程阻塞的话会出现anr给予用户提示,出现这样的情况是开发者在开发过程中就得去避免的!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以在onCreateView结束后再调用异步线程AsyncTask啊,或者在fragment其他生命周期方法中调用这个异步线程啊
更多追问追答
追问
AsyncTask是在MainActivity里面调用执行的,不能放在Fragment里面调用呀。他们是MainActivity里面创造的两条线,一条线创建Fragment对象,另一条线负责在网络上获取信息并更新Fragment
追答
你把代码发出来看看。既然是异步任务在哪调用关系不大的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果这里使用线程wait那一套,代码会变得很复杂。
就你现在的情况,最简单的办法是将你的AsyncTask.excute()方法的调用放到onCreateView()的最后,也就是说,当界面生成后,再开启数据获取线程,然后得到数据更新界面
就你现在的情况,最简单的办法是将你的AsyncTask.excute()方法的调用放到onCreateView()的最后,也就是说,当界面生成后,再开启数据获取线程,然后得到数据更新界面
追问
AsyncTask是在MainActivity里面调用执行的,不能放在Fragment里面调用呀。他们是MainActivity里面创造的两条线,一条线创建Fragment对象,另一条线负责在网络上获取信息并更新Fragment。还有其他方法不?
追答
你非要这样可以复杂点。2个标志位,boolean isGet,isCreate=false;
然后把更新界面的那几行代码提出到一个方法里面,如setDataOnView(data);
还要一个frament的public方法注入数据,以便在activity里的线程获取数据后,将数据传入fragment.如:setData(data);
在onCreateView()的最后:
isCreate = true;
if(isGet){
setDataOnView(data);
}
在fragmentInterface.onInformationGot()方法最后:
isGet = true;
frament.setData(data);
if(isCreate){
frament.setDataOnView(data);
}
这样,无论你哪个线程先执行结束,最终都能更新界面。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询