【问题标题】:Using a splash screen across activities跨活动使用闪屏
【发布时间】:2012-07-13 15:50:05
【问题描述】:

我有一个登录屏幕作为我的第一个活动。它有一个AsyncTask 对象,用于使用 Web 服务进行登录验证。它加载具有选项卡作为活动的主要活动。然后主要活动加载我的第一个选项卡,该选项卡也有一个AsyncTask 对象来加载一些数据。我想显示从登录验证开始(LoginActivity 的onPreExecute)到 FirstActivity 加载其数据(FirstActivity 的onPostExecute)的启动画面。我已经开始实施它,但我被拒绝了预期的结果。在 LoginActivity 的onPostExecute 之后,初始屏幕消失,登录屏幕重新出现一瞬间。之后,我的 FirstActivity 加载时没有显示初始屏幕。

如何继续在这些活动中显示启动画面?

我知道这听起来很复杂。但是我花了很多时间自己解决这个问题,但我还没有成功。任何形式的帮助表示赞赏。谢谢!

编辑

登录活动:

    public Dialog mSplashDialog;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);

            et1 = (EditText) findViewById(R.id.ev_Login_ID);
    et2 = (EditText) findViewById(R.id.ev_Passward);

    // Activity Specicfic code

    }
protected void showSplashScreen() {
    mSplashDialog = new Dialog(this, R.style.SplashScreen);
    mSplashDialog.setContentView(R.layout.splashscreen);
    mSplashDialog.setCancelable(false);
    mSplashDialog.show();
    }
public class LoginProcess extends AsyncTask<Object, Void, Void> {
    private LoginActivity activity;


    private LoginProcess(LoginActivity activity) {
        this.activity = activity;
    }


    /**
     * Showing the dialog on the UI thread.
     */
    @Override
    protected void onPreExecute() {
        showSplashScreen();
    }

    /**
     * Performing the heavy lifting in the background thread thread.
     */
    @Override
    protected Void doInBackground(Object... params) {
        try {


        // User Validation  


    }

    /**
     * When the task is completed, notifiy the Activity.
     */
    @Override
    protected void onPostExecute(Void unused) {

                    Intent i = new Intent(LoginActivity.this, MainActivity.class);
                    i.putExtra("FromOtherTab", true);
                    startActivity(i);
                    finish();
                }


}

主活动:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Bundle extras = getIntent().getExtras();

    // create tabs and set current tab to FirstActivity

    }

第一个活动:

public Dialog mSplashDialog;
private FetchData mTask;


@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.mydashboard);

  }

protected void removeSplashScreen() {
    if (mSplashDialog != null) {
        mSplashDialog.dismiss();
        mSplashDialog = null;
    }

private class FetchData extends AsyncTask<Object, Void, Void> {

private FirstActivity activity;


/**
 * Performing the heavy lifting in the background thread thread.
 */
@Override
protected Void doInBackground(Object... params) {
    // Load data

}

/**
 * When the task is completed, notifiy the Activity.
 */
@Override
protected void onPostExecute(Void unused) {
    // Here I want to call removeSplashScreen();

}

目前,启动画面会加载到 LoginActivity 线程运行为止。之后,FirstActivity 启动。空白布局出现一秒钟(直到从 FirstActivity 加载数据),然后显示正确的屏幕。我想不断显示启动画面,直到 FirstActivity 的 onPostExecute。如果我在 FirstActivity 中创建一个新的 mSplashDialog,那么我会得到两个单独的启动画面实例。第一个在新的出现之前消失。我不确定如何在 FirstActivity 加载时让相同的 mSplashDialog 旋转。

【问题讨论】:

  • 假设 LoginActivity 和 FirstActivity 位于 MainActivity 的选项卡上,您可以将 Splash View 作为 MainActivity 的子视图(即带有选项卡的视图)。它将被配置为 Visibility=INVISIBLE 或 GONE。要显示 Splash,请将其 Visibility 属性设置为 VISIBLE,然后将其设置为 INVISIBLE 以使其消失。
  • 哦不! LoginActivity 是一个单独的活动,它启动 MainActivity
  • 如果您添加代码,我们可以提供更好的帮助。在这一点上,我们只是在猜测可能会发生什么。
  • 您的 IncludeTabActivity 在哪里?
  • 我还想指出,您正在后台线程中调用您的编辑文本。这应该在你的主线程上。

标签: android android-asynctask


【解决方案1】:

如果我是你,我会做的是创建一个启动画面,而不是 AsyncTask。从那里,我将创建一个AsyncTask,它将在显示初始屏幕时加载。在onPostExecute 中,我会从初始屏幕转到您的下一个活动。基本上,如果你把所有的后台活动都放在AsyncTask 中,并且在主 UI 线程上运行启动画面,你应该没问题。在启动屏幕活动中,您只需启动AsyncTaskonPostExecute 会将您从启动屏幕活动移至主要活动。

我希望这是有道理的。这是一个很好的链接,可以帮助AsyncTask

www.peachpit.com/articles/article.aspx?p=1823692&seqNum=3

祝你好运!

【讨论】:

  • 那是大量的返工!我有两个特定于活动的异步任务。将它们移动到单个处理线程将涉及许多更改。随着每个活动中加载的数据进入该特定活动布局的 UI 字段,我还必须跨活动发送许多值。那将是我最后的手段。
  • 好吧,如果没有看到您的代码,很难给出替代解决方案。
【解决方案2】:

你为什么不从你的 asynctask 的 onPreExecute 加载启动画面,然后在 onPostExecute 关闭它(就像你目前正在做的那样)

【讨论】:

    猜你喜欢
    • 2018-12-05
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多