当使用android 4.x运行asyntask时,如何处理屏幕方向更改

Eri*_*ric 9 android screen-orientation android-asynctask

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

****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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

****Androidmanifest.xml****
 <activity 
  android:name=".DataBaseUpdateService"
  android:configChanges="keyboardHidden|orientation"/>
Run Code Online (Sandbox Code Playgroud)

这些代码与android 3.x或更低版本完美配合.但是,它无法正常运行android 4.x.

你知道问题是什么吗?

Ste*_*viN 27

也增加screenSize价值.

来自文档:

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

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

****Androidmanifest.xml****
 <activity 
  android:name=".DataBaseUpdateService"
  android:configChanges="keyboardHidden|orientation|screenSize"/>
Run Code Online (Sandbox Code Playgroud)


CKR*_*666 2

解决方案 1 \xe2\x80\x93 如果您确实需要 AsyncTask,请三思。

\n

解决方案2 \xe2\x80\x93 将AsyncTask放入Fragment中。

\n

解决方案3 \xe2\x80\x93 锁定屏幕方向

\n

解决方案 4 \xe2\x80\x93 防止重新创建 Activity。

\n

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

\n

.....\n问题的发生是因为配置更改时重新创建了活动,例如方向更改等。\n您可以在 asyntask 的 onPreExecuted() 方法中锁定方向更改,并在 onPostExecuted() 方法中解锁它。

\n
import android.app.Activity;\nimport android.content.Context;\nimport android.content.pm.ActivityInfo;\nimport android.content.res.Configuration;\nimport android.os.AsyncTask;\nimport android.widget.Button;\nimport android.widget.ProgressBar;\n\npublic class MyAsyncTask extends AsyncTask<Void, Integer, Void> {\nprivate Context context;\nprivate ProgressBar progressBar;\nprivate Button button;\n\npublic MyAsyncTask(ProgressBar progressBar,Context context,Button button){\n    this.context=context;\n    this.progressBar=progressBar;\n    this.button=button;\n    \n}\n\nprivate void lockScreenOrientation() {\n    int currentOrientation =context.getResources().getConfiguration().orientation;\n    if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) {\n        ((Activity) \n     context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);\n    } else {\n        ((Activity) context). \n     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);\n    }\n}\n \nprivate void unlockScreenOrientation() {\n    ((Activity) context). \n    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);\n}\n\n@Override\nprotected void onPreExecute() {\n    // TODO Auto-generated method stub\n    super.onPreExecute();\n    progressBar.setMax(100);\n    button.setEnabled(false);\n    lockScreenOrientation();\n}\n\n@Override\nprotected Void doInBackground(Void... params) {\n    // TODO Auto-generated method stub\n    \n    \n    for(int i=0;i<=100;i++){\n    try {\n        Thread.sleep(200);\n    } catch (InterruptedException e) {\n        // TODO Auto-generated catch block\n        e.printStackTrace();\n    }\n    publishProgress(i);\n    \n    }\n    \nreturn  null;   \n}\n@Override\nprotected void onProgressUpdate(Integer... values) {\n    // TODO Auto-generated method stub\n    super.onProgressUpdate(values);\n    progressBar.setProgress(values[0]);\n}\n@Override\nprotected void onPostExecute(Void result) {\n    // TODO Auto-generated method stub\n    super.onPostExecute(result);\n    button.setEnabled(true);\n    unlockScreenOrientation();\n}\n\n\n\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n