【问题标题】:how to handle locale and asyncTask for an activity in android when orientation changes方向改变时如何处理android中活动的语言环境和asyncTask
【发布时间】:2011-07-27 12:19:14
【问题描述】:

我现在去安卓了。而且我在开发应用程序时遇到了麻烦,我应该在其中从服务器加载数据,然后用这些数据填充列表。我使用 asyncTask 来执行此操作,并使用 onRetainNonConfigurationInstance() 函数来处理在加载数据时更改屏幕方向,并且效果很好。

当我想处理更改活动的区域设置时,问题就开始了。当我改变方向时,语言环境的变化我已经阅读了这些:-

How do I save an Android application's state?

Activity restart on rotation Android

我想让布局从横向变为纵向所以我没有使用

android:configChanges="locale|orientation"

我仍然无法解决它。我认为系统会自行更改语言,所以当我更改方向时,即使我尝试使用

进行设置
Locale locale = new Locale("ar"); 
                Locale.setDefault(locale);
                Configuration config = new Configuration();
                config.locale = locale;
                getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

我需要完成活动并再次打开它,这将使用户等待更多时间,并且当用户再次尝试更改方向时,它会使应用程序崩溃。

我认为我可以使用 onRetainNonConfigurationInstance() 但我不知道我需要如何处理这些事情。因此,我们将不胜感激任何帮助。

【问题讨论】:

    标签: android localization android-asynctask screen-orientation


    【解决方案1】:

    我现在只是猜测,但也许你可以使用

    onSaveInstanceState(Bundle)
    

    onRestoreInstanceState(Bundle)
    

    在配置更改后恢复您的语言环境。

    【讨论】:

    • 我试图这样做。但我认为,在我自己在 onRestoreInstanceState(Bundle) 中设置区域设置后,我将完成活动并再次重新启动它,这将使我再次开始从服务器加载数据。我说的对吗?
    • 也许我没有正确回答您的问题。因此,您还想保留通过配置更改从服务器加载的数据吗?查看[处理进度对话框和方向更改]blog.doityourselfandroid.com/2010/11/14/… - 这可能会帮助您找到解决方案。
    • 我用这种方式来处理改变方向并且它起作用了。但是现在除了处理更改语言环境之外,我还必须处理这个问题,我想不出一种方法来使用 onRetainNonConfigurationInstance() 来解决这个问题。如何使用 onRetainNonConfigurationInstance() 来保存 asyncTask 和语言环境?
    • 好吧,那我不明白你为什么不能在 onSaveInstanceState(Bundle) 中保存你的语言环境,然后在 onCreate(Bundle) 中恢复它?
    【解决方案2】:

    每次更改配置时,都会创建新的Resources 对象,该对象指向正确的(依赖于配置的)资源。因此,您之前对 Resource 对象的所有更改都将被丢弃。

    在您的情况下,每次调用 onCreate() 时都需要重新设置语言环境。

    建议不要使用android:configChanges,除非您真的了解所有后果并且有充分的理由使用它。请仔细阅读Handling Runtime Changes了解更多详情。

    还有一个提示,将您的 AsyncTask 转移到专门的服务可能是个好主意。由于服务更好地用于此类“后台”任务并且可以更好地处理配置更改,尽管需要更多代码。使用AsyncTasks 时必须非常小心,因为它应该能够在配置更改后保留下来。我在 Activites 中写了两篇关于后台线程的帖子:part 1part 2

    【讨论】:

      【解决方案3】:

      如果您正在使用 Fragments,请考虑将您的 AsyncTask 放入保留自身的 Fragment 中。加上标签,你可以在onCreate再次找回。

      我现在很难找到它,但我认为这是在 Google's I/O app 中使用的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-10
        相关资源
        最近更新 更多