2012-07-24 9 views
9

Próbowałem zaimplementować poniższy kod do obsługi zmian orientacji ekranu.Jak radzić sobie ze zmianami orientacji ekranu, gdy istnieje asyntask działający z Androidem 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"/> 

kody te działają doskonale z Androidem 3.x lub niższej. Jednak nie działa poprawnie dla Androida 4.x.

Czy masz pojęcie o problemie?

Odpowiedz

2

Rozwiązanie 1 - Pomyśl dwa razy, jeśli naprawdę potrzebujesz AsyncTask. Rozwiązanie 2 - Umieść AsyncTask w Fragment. Rozwiązanie 3 - Zablokuj orientację ekranu Rozwiązanie 4 - Zapobieganie odtwarzaniu czynności.

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

..... problem zdarza się, ponieważ działalność odtworzone podczas zmiany konfiguracji, takie jak zmiana orientacji itp można zablokować zmianę orientacji w onPreExecuted() metodę asyntask i odblokować to w metodzie 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 for me .. –

27

Dodaj również wartość screenSize.

Od documentation:

Uwaga: Jeśli aplikacja skierowana poziom API 13 lub wyższy (deklarowany przez minSdkVersion i targetSdkVersion atrybuty), a następnie należy również zadeklarować konfigurację screenSize, bo zmienia się również, gdy urządzenie przełącza orientacje pionową i poziomą.

więc oczywisty powinien wyglądać następująco (jeśli chcesz obsługiwać orientacji zmienia się):

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

Dziękuje ... I rozwiązać problem poprzez dodawanie Rozmiar ekranu – Eric

+0

Wielkie dzięki, można zaoszczędzić mój czas –

+0

Dzięki stary, uratowałeś mój dzień. –

0

nie jestem 100% pewien, że to będzie działać, ale można spróbować zapisać AsyncTask z 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 
} 
Powiązane problemy