我的登录屏幕是我的第一个活动。它有一个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旋转。
答案 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(就像你现在所做的那样)