0

我的 android 应用程序的第一个活动,“启动器活动”,很快就完成了。它的目标是重定向到 MainActivity 或 UserLoginActivity,具体取决于共享首选项变量的值。

如果这个变量不存在,它会自动执行一个 StartActivity 到 MainActivity。如果设置了这个变量,那么它将向我的 API 执行一个 HTTP 请求,以便对用户进行身份验证。然后它将启动 MainActivity。HTTP 请求通常需要不到一秒的时间。

问题是我想在 LauncherActivity 的中心显示一个进度条,以便用户可以了解正在加载的内容。问题是屏幕上没有显示任何内容。但是如果我注释启动活动的行,那么它将被显示......似乎活动持续时间太快而无法显示任何内容!

我认为调用 setContentView() 方法会立即在屏幕上加载视图。我的情况是正常行为吗?知道活动将持续大约一秒钟,我怎么能在屏幕上显示进度条?

在这里你可以看到我的启动器活动

public class Launcher extends Activity {

    private void goToUserLogin(){

        Intent intent;

        intent = new Intent(this, UserLoginActivity.class);
        startActivity(intent);
        finish();
    }

    private void goToMain(){

        YokiAPI API = new YokiAPI(this);
        Intent      intent;

        try {
            if (API.authenticateSmart(YokiGlobals.preferences.getSavedUserId(this))) {
                intent = new Intent(this, MainActivity.class);
                startActivity(intent);
                finish();
            } else {
                this.goToUserLogin();
            }
       } catch (Exception e){}
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launcher);

        // Launch Demo if First Run
        if (YokiGlobals.preferences.getFirstLaunch(this)){
            YokiGlobals.preferences.updateFirstLaunch(false, this);
            this.launchDemo();
        }


        /*
        ** If userId saved, smart Auth and go to Main
        ** Else go to User Login for Full Auth or register
         */

        if (YokiGlobals.preferences.getSavedUserId(this) == null){
            this.goToUserLogin();
        }
        else {
            this.goToMain();
        }
    }
}

和 .xml 资源文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="THIS TEXT WONT APPEAR"
        android:layout_marginTop="208dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

谢谢,奥斯卡

4

2 回答 2

0

我认为调用 setContentView() 方法会立即在屏幕上加载视图

不,不会因为你还在onCreate()。如果您想查看任何 UI,您需要让活动循环走得更远,所以重新编写您的代码或将您的身份验证移动到单独的活动,我是吗?

PS:你使用this.没有任何真实的理由。

于 2015-05-16T19:57:54.477 回答
0

感谢您的帮助。我使用 AsyncTask 从 API 获取数据。主 UI 线程现在可以加载视图。

这是一些非常简化的代码,也许可以帮助其他人。

public class UserSmartAuthActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_smart_auth);

    new SmartAuth().execute();
}

private class SmartAuth extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        Context context = getApplicationContext();
        YokiAPI API = new YokiAPI(context);
        Intent intent = null;

        try {
            if (API.authenticateSmart(YokiGlobals.preferences.getSavedUserId(context)))
                intent = new Intent(context, MainActivity.class);
            else
                intent = new Intent(context, UserLoginActivity.class);
        } catch (Exception e){}
        startActivity(intent);
        finish();
        return null;
    }
}

}

于 2015-05-17T17:46:18.233 回答