0

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

4

2 回答 2

0

Why don't you load the splashscreen from onPreExecute of your asynctask, then close it onPostExecute (as you are currently doing)

于 2012-07-16T13:39:16.673 回答
0

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

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

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

祝你好运!

于 2012-07-13T16:53:18.523 回答