簡體   English   中英

Android中是否有CallBack到SetContentView?

[英]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,則可以使用ServiceBroadCastReceiver

為此,您必須使用interface進行自己的回調。

heavy work應在asynk tasks或作為serviceother threads

不要在運行onCreate()等主UI線程上進行大量計算。

第一個setContentView()將“布局和繪制”消息發布到UI線程消息隊列中會發生什么情況。 然后,您的計算將阻止UI線程,從而阻止處理隊列中的消息。 第二個setContentView()另一個消息發布到隊列。 當控件最終返回到消息循環時,將同時處理兩條消息,並且您將通過最后一次調用setContentView()來設置布局。

對於繁重的計算,請使用單獨的線程。 例如, IntentServiceAsyncTask使線程化變得更容易。

我的駭客

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.

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