java - 如何在 Activity 开始时在进度条上显示进度

标签 java android android-activity loading activity-lifecycle

我想启动一个 Activity ,并在方法完成时显示 Activity 的加载进度。例如,这些方法将是下载数据。问题是,加载栏一开始实际上从未显示为空,它只是在所有方法完成后加载并显示 100% 已满。

我已经测试了一些实现,但没有成功。我现在的状态是在onCreate中设置loading bar为max,然后在onWindowFocusChanged中进行处理。问题是,加载栏永远不会在 onCreate 之后绘制。我也测试了将方法放入 onResume 中,但进度条再次仅在 onCreate、onResumeonWindowFocusChanged 全部完成后出现。这让我对 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/

相关文章:

android - activity.isFinishing 语句中的 BadTokenException : Unable to add window -- token null is not valid; is your activity running?

java - 无法从 ApplicationAdapter 调用 Activity

java - 如何使用 Java 查找 ArrayList<Entry> 中的最小值和最大值

java - hibernate列名问题

android - 编辑文本光标位置

Android Studio 不断要求签名配置,尽管我已经有发布构建 APK

Android:为什么点击 backstack 的 Intent 通知会破坏父 MainActivity?

java - 如何在 finish() 方法中获取上下文?

java - 如何找出在java中调用方法的类?

android - 使用 diskpersistence 时有时不会触发 Firebase setValue() 方法