onStart执行耗时操作后,怎么在onResume回调?

caibirdcnb 2019-02-11 12:52:16

如下面代码所示红色字体,如果我把initViews()方法放在do something位置,没有什么问题,但是initViews()需要放在onResume里面,而且必须是loadCards()执行成功才执行initViews(),请问高手应该如何实现?谢谢!


@Override
protected void onStart() {
super.onStart();

loadCards(new Callback(){
success(List<Card> cardList){do something}
fail(){do other thing}
});
}

@Override
protected void onResume() {
super.onResume();

//my problem is here:
//how to know if loadCards() has finished? then run initViews.

initViews();
}

public void loadCards(Callback callback) {
Runnable runnable = () -> {

//List<Card> cardList = get list from work thread;

mAppExecutors.mainThread().execute(() -> {
if (result == empty) {
callback.fail();
} else {
callback.success(cardList);
}
});
};

mAppExecutors.diskIO().execute(runnable);
}

void initViews(){}
...全文
1430 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hunter_night 2019-02-18
  • 打赏
  • 举报
回复
上面说错了,不是初始化不能执行耗时操作,是主线程不能执行耗时操作~ initViews() 这个方法是用来初始化界面的吧,这个方法如果等待耗时操作,大概是界面创建之前就在等待吧,这样是不行的. 最好是创建了界面之后,如果还在加载数据,就给个loading,耗时操作结束再把数据显示出来.
Hunter_night 2019-02-17
  • 打赏
  • 举报
回复
这种方法是不推荐的,或者说是不允许的... 你如果要执行耗时操作之后再初始化view,想象一下,如果是连接网络,然后网络不好,用户是不是黑屏啥的半天? 通常的做法是,初始化这一系列操作,都不能执行耗时操作,直接初始化,然后使用缓存数据(如果是第一次,则是空白默认数据); 等子线程耗时操作完成之后,再更新数据. 我们使用的应用大多是这样做的,你仔细观察一下,就比如新闻,如果你不开网络,显示的都是上一次新闻.
林一天 2019-02-16
  • 打赏
  • 举报
回复
你把loadCards()这个方法放到onResume中执行,如果loadCards()方法中有耗时操作的话,可以在这个方法中使用handle消息机制,在耗时操作完成后,通知加载initView(),如果loadCards()方法中没有耗时操作的话,可以把initView直接扔到loadCards()方法的最后!
王能 2019-02-14
  • 打赏
  • 举报
回复
增加一个boolean全局变量就行了 boolean threadSuccess=false; initview判断threadSuccess为true才进行操作

initView(){
    if(!threadSuccess) return;
    ...
}
在线程执行完成之后赋值true并再次调用initview

new Callback(){
successs(){
threadSuccess=true;
initView();
}
}
键盘舞者113 2019-02-12
  • 打赏
  • 举报
回复
那IView多设置一个函数,作为返回handler实例不就好了, 而且handler要在全局实例化,不是在某个函数
caibirdcnb 2019-02-11
  • 打赏
  • 举报
回复
引用 1 楼 键盘舞者113 的回复:
你创建一个handler,把initview放入handleMessage函数里,然后在loadcard执行完使用handler发送消息,通知执行就行了

你以后子线程调用主线程都可以使用handler完成


谢谢,请问您的意思是:
1. 写一个Handler类,
2. 在handleMessage里面写initView()等方法,
3. 在onResume()里面new Handler实例,
4. 在loadCards()的callback里面发送msg,对吗?

但如果是mvp架构,presenter是不持有activity实例的,这时候,上面第3步是在activity执行,而第4步是在presenter执行,但第4步执行Message msg = Handler实例.obtainMessage()的时候,需要持有activity才能得到Handler实例。
键盘舞者113 2019-02-11
  • 打赏
  • 举报
回复
你创建一个handler,把initview放入handleMessage函数里,然后在loadcard执行完使用handler发送消息,通知执行就行了

你以后子线程调用主线程都可以使用handler完成

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧