Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当安卓4.x运行asyntask时,如何处理屏幕方向的变化_Android_Android Asynctask_Screen Orientation - Fatal编程技术网

Android 当安卓4.x运行asyntask时,如何处理屏幕方向的变化

Android 当安卓4.x运行asyntask时,如何处理屏幕方向的变化,android,android-asynctask,screen-orientation,Android,Android Asynctask,Screen Orientation,我尝试实现以下代码来处理屏幕方向的更改 ****DataBaseUpdateService.java**** public class DataBaseUpdateService extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Updatetask Task =

我尝试实现以下代码来处理屏幕方向的更改

****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"/>
**Androidmanifest.xml****
这些代码与Android3.x或更低版本完美配合。但是,它不能在android 4.x上正常工作


你知道问题出在哪里吗???

同时添加
屏幕大小

发件人:

注意:如果应用程序的目标API级别为13或更高级别(由minSdkVersion和targetSdkVersion属性声明),则 您还应该声明
screenSize
配置,因为它 当设备在纵向和横向之间切换时也会发生变化 方向

因此,清单应该如下所示(如果您想自己处理方向更改):

**Androidmanifest.xml****

我不能100%确定这是否可行,但您可以尝试使用onNonConfigurationChangedInstance()保存异步任务


解决方案1–如果确实需要异步任务,请三思

解决方案2–将AsyncTask放在一个片段中

解决方案3–锁定屏幕方向

解决方案4–防止重新创建活动

参考:

。。。。。 出现此问题的原因是,在配置更改(如方向更改等)时重新创建了活动。 可以在asyntask的onPreExecuted()方法中锁定方向更改,并在onPostExecuted()方法中解除锁定

导入android.app.Activity;
导入android.content.Context;
导入android.content.pm.ActivityInfo;
导入android.content.res.Configuration;
导入android.os.AsyncTask;
导入android.widget.Button;
导入android.widget.ProgressBar;
公共类MyAsyncTask扩展了AsyncTask{
私人语境;
私人ProgressBar ProgressBar;
私人按钮;
公共MyAsyncTask(ProgressBar ProgressBar、上下文上下文、按钮){
this.context=context;
this.progressBar=progressBar;
这个按钮=按钮;
}
私有void lockScreenOrientation(){
int currentOrientation=context.getResources().getConfiguration().orientation;
if(currentOrientation==Configuration.ORIENTATION\u纵向){
((活动)
设置请求的方向(ActivityInfo.SCREEN\u ORIENTATION\u Graphic);
}否则{
((活动)背景)。
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向);
}
}
私有void unlockScreenOrientation(){
((活动)背景)。
设置请求方向(活动信息屏幕方向传感器);
}
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
设置最大进度条(100);
按钮。设置启用(错误);
锁定屏幕方向();
}
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
对于(int i=0;i
****Androidmanifest.xml****
 <activity 
  android:name=".DataBaseUpdateService"
  android:configChanges="keyboardHidden|orientation|screenSize"/>
// 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
}
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();
}




}