我想启动一个活动,并在方法完成时显示活动加载的进度。例如,这些方法将下载数据。问题是,加载条在开始时从未实际显示为空,只需在所有方法完成后加载并显示100%已满。
我已经测试了一些实现,但没有运气。我所处的当前状态是我在 onCreate 中将加载栏设置为max,然后在 onWindowFocusChanged 中执行处理。问题是,在 onCreate 之后永远不会绘制加载栏。我已经测试了将方法放入 onResume ,但是再次进度条只出现在onCreate之后, onResume 和 onWindowFocusChanged 都已完成。这让我对活动生命周期有了一些了解,因为我认为应该在 onCreate 之后绘制所有视觉元素?
我当前的代码如下(请注意,如果onWindowFocusChanged中的代码放在onResume中,则没有注意到差异)。此代码是所有原型代码,旨在使其生效。
public class IntermediateLoadingScreen extends AppCompatActivity {
private ProgressBar loadingBar = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intermediate_loading_screen);
loadingBar = (ProgressBar)findViewById(R.id.intermediateLoadingBar);
loadingBar.setMax(100);
Log.d("IntermediateLoadScreen","onCreate Complete");
}
@Override
public void onResume () {
super.onResume();
Log.d("IntermediateLoadScreen","onResume");
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.d("IntermediateLoadScreen","onWindowFocusChanged");
if(hasFocus){
AsyncCollectDeviceData asyncCollectDeviceData = new AsyncCollectDeviceData(this.getApplicationContext());
asyncCollectDeviceData.execute();
loadingBar.setProgress(15);
Log.d("IntermediateLoadScreen", "Loading");
getUserContactsFromServer();
getUserGroupsFromServer();
loadingBar.setProgress(100);
/*Intent intent = new Intent(this, nextActivity.class);
startActivity(intent);*/
}
}
public void getUserContactsFromServer(){
Log.d("IntermediateLoadScreen", "getUserContactsFromServer");
loadingBar.setProgress(35);
ContactsResponse contactsResponse = new ServerRequest().submitContactsRequest();
new UserRealmDAO().updateContacts(contactsResponse);
loadingBar.setProgress(60);
}
public void getUserGroupsFromServer(){
Log.d("IntermediateLoadScreen", "getUserGroupsFromServer");
loadingBar.setProgress(80);
GroupsResponse groupsResponse = new ServerRequest().submitGroupsRequest();
new UserRealmDAO().updateGroups(groupsResponse);
loadingBar.setProgress(95);
}
}
我知道我不应该在它自己的活动中有一个加载屏幕,并且应该将它作为活动的一部分,我可以在需要时使其可见。但是应该发生相同的活动流,所以如果我能让这个例子工作,它应该转移。
总之,加载栏在onCreate之后没有显示,之前的活动只是挂起,最终会弹出一个完整的加载栏。如何在开头绘制空的加载条并填写它,因为我称之为'loadingBar.setProgress'?
编辑: 这些是我添加到上述活动的日志,我已将 onWindowFocusChanged 中显示的代码移动到 onResume :
01-20 13:10:15.430 /IntermediateLoadScreen: onCreate Complete
01-20 13:10:15.430 /IntermediateLoadScreen: onResume
01-20 13:10:20.425 /IntermediateLoadScreen: Bar set at progress 15
01-20 13:10:26.242 /IntermediateLoadScreen: Bar set at progress 80
01-20 13:10:31.457 /IntermediateLoadScreen: Bar set at progress 100
第一个(启动画面)活动会一直显示,直到打印完所有这些日志。我在每个进度条设置调用之前放置了一个Thread.sleep,因此您可以看到每个日志之间至少有5秒钟。即使这样做,我的活动也不会显示,直到整个类中的所有方法调用都完成。
答案 0 :(得分:1)
问题是在创建活动后立即调用onWindowFocusChanged(boolean hasFocus)
。所以你的进度条一开始就有15%。
此外,您的所有方法都可能运行得非常快,因此它们将在用户实际看到某些进度之前完成
答案 1 :(得分:1)
这里只是一个建议。通常,如果要加载任何数据/进行后台处理,Android Lollipop中有一个名为SplASHsCREEN的新功能。尝试使用THIS Splash屏幕 - 一个基本的应用程序屏幕,它将显示,直到您加载所有数据,加载后,您可以显示下一个屏幕。
这使用户在启动应用程序后感觉良好,而不是显示进度条。