Android中的SetContentView是否有回调?

时间:2014-02-16 09:09:21

标签: android callback views

在Android中是否有任何关于setContentView的callBack,因为我正在setContentView行之后做一个繁重的操作,它似乎跳过了setContentView。

所以我想将heavyOperation移动到setContentView的callBack。

由于

编辑:

伪代码:

AudioRecord完成 SetContentView(1)//显示没有按钮的“处理”屏幕 FFT分析 SetContentView(2)//在FFT分析中完成。

在我的情况下,“SetContentView(1)”永远不会发生。

编辑#2:编辑#2: 我在另一个Thread中执行了大量操作,并在重度操作完成后使用Handler发送一条消息,将其视为一个callBack。

感谢所有帮助人员

5 个答案:

答案 0 :(得分:2)

简短回答:setContentView没有回调。

如果您正在进行网络操作,那么您可以使用AsyncTask进行此操作。

如果您正在进行更繁重的操作并想要更新用户界面,那么您可以使用ServiceBroadCastReceiver来执行此操作。

为此,您必须使用interface进行自己的回调。

答案 1 :(得分:2)

heavy work应该在asynk tasksserviceother threads

上完成

答案 2 :(得分:2)

不要在运行onCreate()等主要UI线程上进行任何繁重的计算。

第一个setContentView()将“布局和绘制”消息发布到UI线程消息队列会发生什么。然后,您的计算会阻止UI线程,从而阻止处理队列中的消息。第二个setContentView()向队列发送另一条消息。当控件最终返回到消息循环时,两个消息都会被处理,您将通过上次调用setContentView()来设置布局。

对于繁重的计算,请使用单独的线程。例如,IntentServiceAsyncTask使线程更容易。

答案 3 :(得分:0)

我的黑客。

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.
    }
});

要了解会发生什么,请在Looper.loop()中的Message msg = queue.next();行设置一个断点可能会有所帮助。

答案 4 :(得分:0)

一天前我遇到了一个非常相似的问题,但我发现了。 (我知道您的问题已解决,只需提供一种不需要处理程序或回调的其他方法即可。

最适合运行U.I.功能: 如果您需要执行以下操作:runTask() then setContentView() (or any other ui function),则可以使用AsyncTask在不同的线程上运行任务,也可以为任务完成的时间设置计时器(如果您的任务需要一定的时间) ,将调用用户界面功能。 但是由于Timer类在不同的线程上运行函数,因此无法在其中运行setContentView()。因此,您可以在Timer类的重载runOnUiThread(Runnable action)函数内使用run()方法。您只需要定义一个返回可运行对象的函数。在可运行操作中定义您的Ui操作。

希望它可以帮助某人。