如何在活动开始时显示进度条上的进度

时间:2017-01-20 12:57:40

标签: java android android-activity loading activity-lifecycle

我想启动一个活动,并在方法完成时显示活动加载的进度。例如,这些方法将下载数据。问题是,加载条在开始时从未实际显示为空,只需在所有方法完成后加载并显示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秒钟。即使这样做,我的活动也不会显示,直到整个类中的所有方法调用都完成。

2 个答案:

答案 0 :(得分:1)

问题是在创建活动后立即调用onWindowFocusChanged(boolean hasFocus)。所以你的进度条一开始就有15%。 此外,您的所有方法都可能运行得非常快,因此它们将在用户实际看到某些进度之前完成

答案 1 :(得分:1)

这里只是一个建议。通常,如果要加载任何数据/进行后台处理,Android Lollipop中有一个名为SplASHsCREEN的新功能。尝试使用THIS Splash屏幕 - 一个基本的应用程序屏幕,它将显示,直到您加载所有数据,加载后,您可以显示下一个屏幕。

这使用户在启动应用程序后感觉良好,而不是显示进度条。