2012-07-24 15 views
9

के साथ चल रहे एसिन्टास्क होने पर स्क्रीन अभिविन्यास परिवर्तनों को कैसे संभालें I स्क्रीन अभिविन्यास परिवर्तनों को संभालने के लिए निम्न कोड को लागू करने का प्रयास किया।एंड्रॉइड 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"/> 

उन कोड एंड्रॉयड 3.x या कम के साथ पूरी तरह से काम। हालांकि, यह एंड्रॉइड 4.x के लिए ठीक से काम नहीं करता है।

क्या आपको पता है कि समस्या क्या है ??

उत्तर

2

समाधान 1 - यदि आपको वास्तव में एक AsyncTask की आवश्यकता है तो दो बार सोचें। समाधान 2 - एक टुकड़े में AsyncTask रखें। समाधान 3 - स्क्रीन अभिविन्यास को लॉक करें समाधान 4 - गतिविधि को पुनर्निर्मित होने से रोकें।

संदर्भ: http://androidresearch.wordpress.com/2013/05/10/dealing-with-asynctask-and-screen-orientation/

..... समस्या इसलिए होता है क्योंकि गतिविधि निर्मित जब विन्यास बदलाव, उन्मुखीकरण परिवर्तन आदि जैसे आप asyntask की onPreExecuted में उन्मुखीकरण परिवर्तन() विधि ताला और अनलॉक कर सकते हैं यह 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

धन्यवाद। मेरे लिए काम किया .. –

27

screenSize मूल्य भी जोड़ें।

documentation से

:

नोट: आपके आवेदन एपीआई स्तर को लक्षित करता है 13 या इससे अधिक (के रूप में minSdkVersion और targetSdkVersion विशेषताओं द्वारा घोषित), तो आप भी screenSize विन्यास, घोषित करना चाहिए क्योंकि यह जब डिवाइस पोर्ट्रेट और लैंडस्केप अभिविन्यास के बीच स्विच करता है तो भी बदलता है।

तो, प्रकट इस तरह दिखना चाहिए (अपने आप बदल जाता है आप उन्मुखीकरण संभाल करना चाहते हैं):

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

ठनक यू ... मैं screenSize – Eric

+0

बहुत बहुत शुक्रिया जोड़कर समस्या का समाधान है, तो आप अपने समय –

+0

धन्यवाद आदमी को बचाने के लिए, आप मेरा दिन बचा लिया। –

0

मैं 100% यकीन है कि यह काम करेगा नहीं कर रहा हूँ, लेकिन आप अपने AsyncTask बचाने की कोशिश कर सकते ऑन कॉन्फिगरेशन चेंज इंस्टेंस() पर।

// 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 
}