Pantalla de inicio de sesión que muestra progressdialog y permite cambiar la orientación de la pantalla

Hola estoy tratando de implementar una pantalla de inicio de sesión que muestra un diálogo de progreso y permitir que el teléfono para rotar.

Quiero preguntar cuál es la mejor manera de hacer eso (IntentService, AsyncTask, Servicio) y permitir que el teléfono para rotar?

He leído muchas respuestas diciendo cosas diferentes usando un fragmento vacío con AsyncTask, etc.

Usted puede hacer algo como eso en el manifiesto para permitir la rotación:

<application android:allowBackup="true" android:configChanges="orientation|keyboardHidden|screenSize" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name=".activities.MainActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name"/> 

Entonces usted puede coger la rotación con este snipet dentro de su actividad:

  @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.v(this.getClass().getName(), "onConfigurationChanged()"); } 

Para hacer un asíntato con diálogo de progreso, este snipet debe darle un ligth:

 private ProgressDialog pDialog; private class MyAsync extends AsyncTask<String, Void, String> { Activity context; public MyAsync (Activity context) { this.context = context; } @Override protected void onPreExecute(){ super.onPreExecute(); pdia = new ProgressDialog(context); pdia.setMessage("Loading..."); pdia.show(); } @Override protected String doInBackground(String... urls) { ... //do your login scheme ... //context.methods() return "ok"; } @Override protected void onPostExecute(String result) { pDialog.dismiss(); if(result!=null && result.equals("ok")){ //login was successfully done } else { //login has failed } } } 

Y para usar este asincestreo que debe llamar:

 new MyAsync(this).execute(null, null , null); 

Por cierto, this es tu actividad / fragmento.

Prueba a añadir este atributo android:configChanges="orientation" a tu elemento Activity en el archivo AndroidManifest.xml . Mostrar un ProgressDialog en el método onPreExecute de un objeto AsyncTask y cancelar el ProgressDialog en el método onPostExecute. DoInBackground está en ejecución Cuando cambia la orientación.

Consulte http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html para obtener una respuesta detallada.

Básicamente, puede usar fragmento con setRetainInstance establecido como true dentro de su LoginActivity para que no se destruya cuando se recrea la actividad durante el cambio de orientación.

Código de muestra :

 public class AsyncFragment extends Fragment { private LoginTask mTask; private AsyncTaskListener mListener; private static final String TAG = "AsyncFragment"; private boolean isTaskRunning = false; private ProgressDialog mProgressDialog; FrameLayout mLayout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); mTask = new LoginTask(); mTask.execute(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mLayout = new FrameLayout(getActivity()); mLayout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); if(isTaskRunning) { mProgressDialog = new ProgressDialog(getActivity()); mProgressDialog.show(); } return mLayout; } @Override public void onDestroyView() { if(mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); mProgressDialog = null; } super.onDestroyView(); } @Override public void onAttach(Context context) { super.onAttach(context); try { mListener = (AsyncTaskListener) context; } catch (ClassCastException e) { Log.d(TAG, "Class not instance of AsyncTaskListener"); } } @Override public void onDetach() { mListener = null; super.onDetach(); } private class LoginTask extends AsyncTask<Void,Integer,Void> { @Override protected Void doInBackground(Void... params) { if(mListener != null) { mListener.onBackground(); } SystemClock.sleep(10000); return null; } @Override protected void onPreExecute() { isTaskRunning = true; mProgressDialog = new ProgressDialog(getActivity()); mProgressDialog.show(); if(mListener != null) { mListener.onPreExecute(); } super.onPreExecute(); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); if(mListener != null) { mListener.onPostExecute(); } isTaskRunning = false; if(mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); mProgressDialog = null; } } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if(mListener != null) { mListener.onProgressUpdate(values[0]); } } @Override protected void onCancelled() { super.onCancelled(); if(mListener != null) { mListener.onCancelled(); } } } //Listener to notify for async task callbacks public interface AsyncTaskListener{ void onPreExecute(); void onPostExecute(); void onCancelled(); void onBackground(); void onProgressUpdate(int progress); } } 

LoginActivity

 public class MainActivity extends AppCompatActivity implements AsyncFragment.AsyncTaskListener{ private static final String FRAGMENT_TAG = "asyncFragment"; private static final String TAG = "MainActivity"; private AsyncFragment mAsyncFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FragmentManager fm = getSupportFragmentManager(); mAsyncFragment = (AsyncFragment) fm.findFragmentByTag(FRAGMENT_TAG); if (mAsyncFragment == null) { //fragment was retained during orientation change mAsyncFragment = new AsyncFragment(); fm.beginTransaction().add(mAsyncFragment, FRAGMENT_TAG).commit(); } } @Override public void onPreExecute() { Log.d(TAG, "onPreExecute: "); } @Override public void onPostExecute() { Log.d(TAG, "onPostExecute: "); } @Override public void onCancelled() { Log.d(TAG, "onCancelled: "); } @Override public void onBackground() { Log.d(TAG, "onBackground: "); } @Override public void onProgressUpdate(int progress) { Log.d(TAG, "onProgressUpdate: "); } 

¿Has probado esto?

 <activity android:name=".MainActivity" android:configChanges="orientation|screenSize"> </activity> 

De esta manera la actividad no será recreada. Pero puede detectar la orientación de la pantalla utilizando onConfigurationChanged()

  • Native crash en /system/lib/libart.so
  • IntentService's onHandleIntent (Intent) obtiene nulo argumento
  • Establecer permiso "permiso" por defecto en "Asus auto start manager" de código
  • ¿Cómo detener el servicio cuando la aplicación se detiene o se destruye pero no cuando cambia a una nueva actividad?
  • START_STICKY para IntentService
  • Android IntentService no puede instanciar clase; Sin constructor vacío
  • ¿Debo usar Service o IntentService?
  • ResultReceiver.send sólo se puede llamar desde el mismo grupo de biblioteca
  • Error de acceso de realm de subproceso incorrecto al usar código compartido entre IntentService y AsyncTask (Android)
  • Repetición de IntentService usando Timers- ¿es aconsejable?
  • ¿Cómo mantener un IntentService funcionando incluso cuando la aplicación está cerrada?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.