2012-07-24 10 views
9

Intenté implementar el siguiente código para manejar los cambios de orientación de la pantalla.Cómo manejar la orientación de la pantalla cambia cuando hay un asyntask ejecutándose con android 4.x

****DataBaseUpdateService.java**** 

public class DataBaseUpdateService extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Updatetask Task = new Updatetask(this.getApplicationContext()); 
      if(Task.getStatus() == AsyncTask.Status.PENDING){ 
      Task.execute();}; 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
    } 
} 

=========================================== ===============================

****Androidmanifest.xml**** 
<activity 
    android:name=".DataBaseUpdateService" 
    android:configChanges="keyboardHidden|orientation"/> 

Estos códigos funcionan perfectamente con Android 3.x o inferior. Sin embargo, no funciona correctamente para Android 4.x.

¿Tiene alguna idea de cuál es el problema?

Respuesta

2

Solución 1 - Piense dos veces si realmente necesita una AsyncTask. Solución 2: coloque la tarea Async en un fragmento. Solución 3 - Bloquee la orientación de la pantalla Solución 4 - Evite que se vuelva a crear la actividad.

Referencia: http://androidresearch.wordpress.com/2013/05/10/dealing-with-asynctask-and-screen-orientation/

..... el problema ocurre porque la actividad crear cuando los cambios de configuración, como el cambio de orientación etc. puede bloquear el cambio de orientación en el onPreExecuted() de asyntask y desbloquear en el método onPostExecuted().

import android.app.Activity; 
import android.content.Context; 
import android.content.pm.ActivityInfo; 
import android.content.res.Configuration; 
import android.os.AsyncTask; 
import android.widget.Button; 
import android.widget.ProgressBar; 

public class MyAsyncTask extends AsyncTask<Void, Integer, Void> { 
private Context context; 
private ProgressBar progressBar; 
private Button button; 

public MyAsyncTask(ProgressBar progressBar,Context context,Button button){ 
    this.context=context; 
    this.progressBar=progressBar; 
    this.button=button; 

} 

private void lockScreenOrientation() { 
    int currentOrientation =context.getResources().getConfiguration().orientation; 
    if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) { 
     ((Activity) 
    context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } else { 
     ((Activity) context). 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    } 
} 

private void unlockScreenOrientation() { 
    ((Activity) context). 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
} 

@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    super.onPreExecute(); 
    progressBar.setMax(100); 
    button.setEnabled(false); 
    lockScreenOrientation(); 
} 

@Override 
protected Void doInBackground(Void... params) { 
    // TODO Auto-generated method stub 


    for(int i=0;i<=100;i++){ 
    try { 
     Thread.sleep(200); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    publishProgress(i); 

    } 

return null; 
} 
@Override 
protected void onProgressUpdate(Integer... values) { 
    // TODO Auto-generated method stub 
    super.onProgressUpdate(values); 
    progressBar.setProgress(values[0]); 
} 
@Override 
protected void onPostExecute(Void result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    button.setEnabled(true); 
    unlockScreenOrientation(); 
} 




} 
+0

Thanks.worked para mí .. –

27

Agregue screenSize valor también.

De documentation:

Nota: Si su aplicación se dirige a nivel de la API 13 o superior (según lo declarado por el minSdkVersion y targetSdkVersion atributos), entonces también debe declarar la configuración screenSize, porque también cambia cuando un dispositivo cambia entre orientación vertical y horizontal .

Así, manifiesta debería tener este aspecto (si desea manejar la orientación cambia a sí mismo):

****Androidmanifest.xml**** 
<activity 
    android:name=".DataBaseUpdateService" 
    android:configChanges="keyboardHidden|orientation|screenSize"/> 
+1

Gracias ... Me resolver el problema mediante la adición ScreenSize – Eric

+0

muchas gracias, se ahorra el tiempo –

+0

Gracias hombre, guardó mi día. –

0

No estoy 100% seguro de que esto va a funcionar, pero usted podría intentar salvar su AsyncTask con onNonConfigurationChangedInstance().

// Declare a member variable 
private UpdateTast task; 

public void onCreate(){ 

    // Attempt to get the asynctask instance 
    task=(UpdateTask)this.getLastNonConfigurationInstance(); 

    // If it's null create a new instance 
    if(task==null){ 
     task = new Updatetask(this.getApplicationContext()); 
     task.execute(). 

    } 

    // If it is not null, then the reference returned by getLastNonConfigurationInstance(); will be used. 
} 

// And lastly override onRetainNonConfigurationInstance method: 
@Override 
public Object onRetainNonConfigurationInstance() {   
    return task 
} 
Cuestiones relacionadas