簡體   English   中英

方向更改時如何處理android中活動的語言環境和asyncTask

[英]how to handle locale and asyncTask for an activity in android when orientation changes

我現在到了android。 而且我在開發應從服務器加載數據然后使用此數據填充列表的應用程序時遇到了麻煩。 我使用asyncTask來做到這一點,並且使用onRetainNonConfigurationInstance()函數來處理在加載數據時更改屏幕方向,並且效果很好。

當我想處理活動的區域設置時,問題就開始了。 當我改變方向時,區域設置也發生了變化:

如何保存Android應用程序的狀態?

Activity在旋轉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(),但是我不知道如何處理這些事情。 因此,任何幫助將不勝感激。

每次更改配置時,都會創建新的Resources對象,該對象指向正確的(依賴於配置的)資源。 因此,您之前對Resource對象所做的所有更改都將被丟棄。

在您的情況下,每次調用onCreate()都需要重新設置區域設置。

作為擁護者,除非您真正了解所有后果並有充分的理由使用它,否則請勿使用android:configChanges 請仔細閱讀Handling Runtime Changes以獲取更多詳細信息。

還有一個提示,將AsyncTask移至專用服務可能是個好主意。 盡管更好地采用了服務來執行此類“后台”任務,並且可以更好地處理配置更改,但是需要更多的代碼。 使用AsyncTask時必須非常小心,因為它應可承受配置更改。 我寫了兩篇關於Activites中的后台線程的文章: 第1 部分第2部分

我現在只是猜測,但也許您可以使用

onSaveInstanceState(Bundle)

onRestoreInstanceState(Bundle)

在配置更改后恢復您的語言環境。

如果您使用的是Fragments,請考慮將AsyncTask放在保留自身的Fragment中。 使用標簽添加它,然后可以在onCreate再次檢索它。

我現在很難找到它,但是我認為這是在Google的I / O應用程序中使用的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM