Я пытаюсь создать заставку для моего приложения для Android, где страница входа в систему только запускает активность Splash, а затем все файлы обработки входа в нее выполняются. Затем он возвращает логическое значение, было ли логин выполненным или нет. Но обработка входа завершается до загрузки содержимого макета XML. Как это можно зафиксировать?
Это моя активность заставки:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
if(extras !=null)
{
url = extras.getString("url");
}
setContentView(R.layout.splashscreen);
url += "login/?userName=" + Login.loginName + "&password=" + Login.password;
DomLoginParser parser = new DomLoginParser(url);
if(parser.parse())
{
Login.loginSuccessful = true;
}
else
{
Login.loginSuccessful = false;
}
finish();
}
Переместите логин из вызова onCreate, используя AsyncTask для входа в систему. То, что вы делаете, завершает работу, прежде чем дать ей возможность показать содержимое. Активность показывает contentView только после завершения вызова onCreate...
Попробуйте что-то вроде этого:
private class LoginChecker extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... args) {
DomLoginParser parser = new DomLoginParser(url);
if(parser.parse()) {
Login.loginSuccessful = true;
} else {
Login.loginSuccessful = false;
}
return null;
}
protected void onPostExecute(Long result) {
// finish the activity
}
}
Чтобы вызвать это, обновите метод onCreate до следующего:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
if(extras !=null) {
url = extras.getString("url");
}
setContentView(R.layout.splashscreen);
url += "login/?userName=" + Login.loginName + "&password=" + Login.password;
new LoginChecker.execute();
}
Не знаю, что делает DomLoginParser, и полагая, что класс Login статичен, но почему вы называете метод finish() внутри onCreate()?
В этой проблеме вы немедленно уничтожаете деятельность!
Удалите вызов finish().
Если
DomLoginParser parser = new DomLoginParser(url);
if(parser.parse())
{
Login.loginSuccessful = true;
}
else
{
Login.loginSuccessful = false;
}
это все, что вы делаете для входа в систему, и хотите, чтобы заставка была видимой в течение некоторого времени, вызовите Thread.sleep() (но имейте в виду, что она может создавать приложение, не отвечающее, если сон слишком много времени), или просто создать отдельный процесс (Asynctask или threadhandler, связанный с другим потоком, который говорит вашему экрану заставки).