[英]Is there a callBack to SetContentView in Android?
Android中是否有對setContentView的callBack,因為我在setContentView行之后立即進行了繁重的操作,因此似乎跳過了setContentView。
所以我在考慮將heavyOperation移到setContentView的callBack上。
謝謝
編輯:
偽代碼:
AudioRecord完成SetContentView(1)//顯示沒有按鈕的“處理中”屏幕FFT分析SetContentView(2)//在FFT分析完成時。
就我而言,“ SetContentView(1)”從未發生。
編輯#2:我在另一個線程中執行了繁重的操作,並在繁重的操作完成后使用Handler發送消息,以將其視為CallBack。
謝謝大家的幫助
簡短答案: setContentView
沒有回調。
如果您正在執行網絡操作,則可以為此使用AsyncTask
。
如果您要執行更繁重的操作並想要更新UI,則可以使用Service
和BroadCastReceiver
。
為此,您必須使用interface
進行自己的回調。
heavy work
應在asynk tasks
或作為service
或other threads
不要在運行onCreate()
等主UI線程上進行大量計算。
第一個setContentView()
將“布局和繪制”消息發布到UI線程消息隊列中會發生什么情況。 然后,您的計算將阻止UI線程,從而阻止處理隊列中的消息。 第二個setContentView()
另一個消息發布到隊列。 當控件最終返回到消息循環時,將同時處理兩條消息,並且您將通過最后一次調用setContentView()
來設置布局。
對於繁重的計算,請使用單獨的線程。 例如, IntentService
或AsyncTask
使線程化變得更容易。
我的駭客
final Handler handler = new Handler();
setContentView(layoutResID); // This posts some messages to message queue.
handler.post(new Runnable() { // Post another message at the end.
@Override
public void run()
{
// Called after layout has changed.
// If you want to skip some more works (like transitions),
// call another handler.post() here.
}
});
要查看發生了什么,請在Message msg = queue.next();
行設置一個斷點Message msg = queue.next();
在Looper.loop()中可能會有所幫助。
一天前,我遇到了一個非常類似的問題,但我發現了。 (我知道您的問題已解決,只需提供一種不需要處理程序或回調的其他方法即可。
最適合運行UI函數:如果您需要執行以下操作: runTask() then setContentView() (or any other ui function)
,則可以使用AsyncTask
在不同的線程上運行任務,也可以為任務完成(如果您的任務需要一定時間),將調用用戶界面功能。 但是由於Timer類在不同的線程上運行函數,因此無法在其中運行setContentView()
。 因此,您可以在Timer類的重載run()
函數內使用runOnUiThread(Runnable action)
方法。 您只需要定義一個返回可運行對象的函數。 在可運行操作中定義您的Ui操作。
希望它可以幫助某人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.