В моем приложении пользователь должен авторизироваться.Android AsyncTask повторно запускается при открытии активности
- Они открывают приложение на странице входа
- Они входят электронный/пароль и попал в аккаунт
- LoadingScreenActivity открывается, что имеет Swirly круг и работает под AsyncTask, который идет в моей базе данных и извлекает все информация о пользователях
После завершения работы AsyncTask он начинает запускать MainPageActivity.
Есть две проблемы с этим на данный момент:
- Если пользователь входит в систему, а затем переходит на домашний экран в то время как приложение загружает MainPageActivity откроется, как только он будет готов (на вершине существующая домашняя страница), даже если приложение было сведено к минимуму
- Если пользователь входит в систему, а затем переходит на домашний экран в то время как приложения нагрузки, а затем возвращается к экрану нагружения AsyncTask завершит дважды
Для проблемы 1. В настоящий момент мой Метод PostExecute() в LoadingScreenActivity выглядит следующим образом:
@Override
public void onPostExecute() {
//open the main page
Intent mainPage = new Intent(getApplicationContext(), MainPageActivity.class);
mainPage.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mainPage.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(mainPage);
}
Есть ли способ, которым я мог бы обнаружить в этом методе, если главная страница деятельность должна быть открыта еще?
Для проблемы 2. Я наткнулся на полный дорожный блок на этом, есть ли способ обнаружить, что активность просто была открыта, а не запущена в первый раз? Я бы очень признателен за любые советы по этому поводу, я совершенно новичок в андроиде, поэтому я даже не уверен, что задача Async - это путь к этому.
Спасибо за ваше время
LoadingScreenActivity.java
public class LoadingScreenActivity extends Activity implements TaskFragment.TaskCallbacks {
private static final String TAG_TASK_FRAGMENT = "task_fragment";
private TaskFragment mTaskFragment;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
FragmentManager fm = getFragmentManager();
mTaskFragment = (TaskFragment) fm.findFragmentByTag(TAG_TASK_FRAGMENT);
// If the Fragment is non-null, then it is currently being
// retained across a configuration change.
if (mTaskFragment == null) {
mTaskFragment = new TaskFragment();
fm.beginTransaction().add(mTaskFragment, TAG_TASK_FRAGMENT).commit();
}
setContentView(R.layout.loading_screen);
ActionBar actionBar = getActionBar();
actionBar.hide();
TextView title = (TextView) findViewById(R.id.loading_title);
TextView progress = (TextView) findViewById(R.id.loading_progress);
title.setText(R.string.app_name);
progress.setText("Loading your info");
}
@Override
public Context onPreExecute() {
return getApplicationContext();
}
@Override
public void onProgressUpdate(int percent) {
}
@Override
public void onCancelled() {
Intent login = new Intent(getApplicationContext(), LoginActivity.class);
login.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(login);
finish();
}
@Override
public void onPostExecute() {
//open the main page
Intent mainPage = new Intent(getApplicationContext(), MainPageActivity.class);
mainPage.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mainPage.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(mainPage);
}
}
и TaskFragment.java
public class TaskFragment extends Fragment {
static interface TaskCallbacks {
Context onPreExecute();
void onProgressUpdate(int percent);
void onCancelled();
void onPostExecute();
}
private TaskCallbacks mCallbacks;
private DummyTask mTask;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallbacks = (TaskCallbacks) activity;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Retain this fragment across configuration changes.
setRetainInstance(true);
// Create and execute the background task.
mTask = new DummyTask();
mTask.execute();
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
private class DummyTask extends AsyncTask<Void, Integer, Void> {
Context context;
boolean running = true;
@Override
protected void onPreExecute() {
if (mCallbacks != null) {
context = mCallbacks.onPreExecute();
}
}
@Override
protected Void doInBackground(Void... ignore) {
//Get the current thread's token
synchronized (this)
{
if(running){
DatabaseHandler dbHandler = new DatabaseHandler(context);
dbHandler.populateSQLiteDatabase();
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... percent) {
if (mCallbacks != null) {
mCallbacks.onProgressUpdate(percent[0]);
}
}
@Override
protected void onCancelled() {
if (mCallbacks != null) {
mCallbacks.onCancelled();
}
}
@Override
protected void onPostExecute(Void ignore) {
if (mCallbacks != null) {
mCallbacks.onPostExecute();
}
}
}
}
Вы проверили 'onConfigurationChanged()' в активности экрана загрузки. Просто воспользуйтесь этим леммом и отбросьте ответ. – BackStabber
с повторным открытием вы подразумеваете навигацию от любого другого вида деятельности? –
Также покажите свой AndroidManifest.xml –