2014-10-29 3 views
0

В моем приложении пользователь должен авторизироваться.Android AsyncTask повторно запускается при открытии активности

  • Они открывают приложение на странице входа
  • Они входят электронный/пароль и попал в аккаунт
  • LoadingScreenActivity открывается, что имеет Swirly круг и работает под AsyncTask, который идет в моей базе данных и извлекает все информация о пользователях

После завершения работы AsyncTask он начинает запускать MainPageActivity.

Есть две проблемы с этим на данный момент:

  1. Если пользователь входит в систему, а затем переходит на домашний экран в то время как приложение загружает MainPageActivity откроется, как только он будет готов (на вершине существующая домашняя страница), даже если приложение было сведено к минимуму
  2. Если пользователь входит в систему, а затем переходит на домашний экран в то время как приложения нагрузки, а затем возвращается к экрану нагружения 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(); 
    } 
} 


    } 
} 
+0

Вы проверили 'onConfigurationChanged()' в активности экрана загрузки. Просто воспользуйтесь этим леммом и отбросьте ответ. – BackStabber

+0

с повторным открытием вы подразумеваете навигацию от любого другого вида деятельности? –

+0

Также покажите свой AndroidManifest.xml –

ответ

0

в вашей деятельности в манифесте просто добавить android:configChanges="keyboardHidden|orientation|screenSize" и в своей деятельности реализовать этот

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
}; 
+0

Привет, спасибо за ваш ответ. Я должен был упомянуть, что моя задача async уже работает отлично, если вы поворачиваете экран. Я использую его совместно с TaskFragment. Теперь я отредактирую свой вопрос, чтобы включить LoadScreenActivity и TaskFragment. – user3707803

+0

Я отправил свой код, я не публиковал его изначально, потому что он грязный. Но я должен был упомянуть, что это касается изменений ориентации. – user3707803

+0

Подождите, что было глупо, жаль, что у меня сейчас это работает, что полностью исправляет проблему 2! Спасибо за вашу помощь :) – user3707803

0

Боюсь, я действительно не понимаю вашу первую проблему. О втором, есть несколько способов в зависимости от вашего минимального уровня API. Начиная с API 14 вы можете регистрировать обратные вызовы ActivityLifecycle в приложении для Android.Чтобы сделать это, я бы рекомендовал:

  1. Наследование Android приложений с пользовательским один
  2. Замените Android приложение в манифесте
  3. в пользовательском приложении зарегистрировать себя как жизненный цикл активности слушатель
  4. внутри абстрактного методы могут получить экземпляр действующего в настоящее время действия (может быть безопасно object.name() в строке)
  5. В зависимости от вашей обработки вы можете безопасно булево значение или что бы то ни было, чтобы определить поведение
  6. методы внутри пользовательские приложения доступны литьем (MyCustomApplication)getApplication()

Heres сниппет:

package com.example.preferencestest; 

import android.app.Activity; 
import android.app.Application; 
import android.app.Application.ActivityLifecycleCallbacks; 
import android.os.Bundle; 

public class MyCustomApplication extends Application implements ActivityLifecycleCallbacks { 
    private String storedActivity; 
    private Boolean doOrNot = false; 

    public MyCustomApplication() {} 
    public Boolean getDoOrNot() { return doOrNot;} 
    public void setDoOrNot(Boolean doOrNot) { this.doOrNot = doOrNot; } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     registerActivityLifecycleCallbacks(this); 
    } 

    // these two are the most important ones since they will be fired everytime 
    @Override 
    public void onActivityResumed(Activity activity) { 
     if (activity.getClass().getName().equals(storedActivity)) { 
      doOrNot = true; 
     } 
    } 
    @Override 
    public void onActivityPaused(Activity activity) { 
     storedActivity = activity.getClass().getName(); 
    } 


    @Override 
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } 
    @Override 
    public void onActivityStarted(Activity activity) { } 
    @Override 
    public void onActivityStopped(Activity activity) { } 
    @Override 
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } 
    @Override 
    public void onActivityDestroyed(Activity activity) { } 
} 

внутри манифеста вы должны объявить этот новый Applicationclass так:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.preferencestest" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="16" 
     android:targetSdkVersion="21" /> 

    <application 
     android:name="com.example.preferencestest.MyCustomApplication" 
{...} 

Тогда внутри свою деятельность вы можете сделать:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Boolean whatToDo = ((MyCustomApplication)getApplication()).getDoOrNot(); 
} 

Использование onConfigurationChanged имеет несколько недостатков. Есть несколько действий (размещение устройства в доке, поворот дисплея и т. Д.), Которые перезапускают Activity. Вы должны сохранить текущее состояние активности с

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 
@Override 
protected void onRestoreInstanceState(Bundle state) { 
    super.onRestoreInstanceState(state); 
} 
+0

Спасибо за ваш ответ, я уже принял ответ выше, как решение моей проблемы. Я взгляну на это быстро. Извините, мне не хватает репутации, чтобы поддержать свой ответ – user3707803