我想启动一个 Activity ,并在方法完成时显示 Activity 的加载进度。例如,这些方法将是下载数据。问题是,加载栏一开始实际上从未显示为空,它只是在所有方法完成后加载并显示 100% 已满。
我已经测试了一些实现,但没有成功。我现在的状态是在onCreate中设置loading bar为max,然后在onWindowFocusChanged中进行处理。问题是,加载栏永远不会在 onCreate 之后绘制。我也测试了将方法放入 onResume 中,但进度条再次仅在 onCreate、onResume 和 onWindowFocusChanged 全部完成后出现。这让我对 Activity 生命周期的理解有点偏离,因为我认为所有视觉元素都应该在 onCreate 之后绘制?
我现在的代码如下(注意把onWindowFocusChanged里面的代码放在onResume里面是看不出有什么区别的)。此代码是所有原型(prototype)代码,旨在使其正常工作。
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);
}
}
我知道我不应该在它自己的 Activity 中真正有一个加载屏幕,并且应该将它作为我可以在需要时显示的 Activity 的一部分。但是应该会发生相同的 Activity 流程,所以如果我能让这个示例正常工作,它应该会转移。
总而言之,加载栏在 onCreate 之后不显示,之前的 Activity 只是挂起,最终弹出一个完整的加载栏。我怎样才能在开始时绘制空的加载栏并在我调用“loadingBar.setProgress”时填充它?
编辑: 这些是我添加到上述 Activity 中的日志,我已将 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
第一个(闪屏) Activity 会一直显示,直到所有这些日志都打印出来。我在每个进度条设置调用之前放置了一个 Thread.sleep,因此您可以看到每个日志之间至少有 5 秒的间隔。即使在这样做之后,我的 Activity 也不会显示,直到整个类中的所有方法调用都完成。
最佳答案
问题是 onWindowFocusChanged(boolean hasFocus)
将在创建 Activity 后立即调用。所以你的进度条一开始会有15%。
此外,您所有的方法都可能运行得非常快,因此它们将在用户实际看到一些进展之前完成
关于java - 如何在 Activity 开始时在进度条上显示进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41764273/