跨活动使用启动画面

时间:2012-07-13 15:50:05

标签: android android-asynctask

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

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

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

修改

LoginActivity:

    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();
                }


}

MainActivity:

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

    Bundle extras = getIntent().getExtras();

    // create tabs and set current tab to FirstActivity

    }

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,那么我会得到两个separe的splashscreen实例。首先在新的出现之前消失。我不确定在FirstActivity加载时如何使相同的mSplashDialog旋转。

2 个答案:

答案 0 :(得分:0)

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

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

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

祝你好运!

答案 1 :(得分:0)

为什么不从asynctask的onPreExecute加载splashscreen,然后关闭onPostExecute(就像你现在所做的那样)