在Android中是否有任何关于setContentView的callBack,因为我正在setContentView行之后做一个繁重的操作,它似乎跳过了setContentView。
所以我想将heavyOperation移动到setContentView的callBack。
由于
编辑:
伪代码:
AudioRecord完成 SetContentView(1)//显示没有按钮的“处理”屏幕 FFT分析 SetContentView(2)//在FFT分析中完成。
在我的情况下,“SetContentView(1)”永远不会发生。
编辑#2:编辑#2: 我在另一个Thread中执行了大量操作,并在重度操作完成后使用Handler发送一条消息,将其视为一个callBack。感谢所有帮助人员
答案 0 :(得分:2)
简短回答:setContentView
没有回调。
如果您正在进行网络操作,那么您可以使用AsyncTask
进行此操作。
如果您正在进行更繁重的操作并想要更新用户界面,那么您可以使用Service
和BroadCastReceiver
来执行此操作。
为此,您必须使用interface
进行自己的回调。
答案 1 :(得分:2)
heavy work
应该在asynk tasks
或service
或other threads
答案 2 :(得分:2)
不要在运行onCreate()
等主要UI线程上进行任何繁重的计算。
第一个setContentView()
将“布局和绘制”消息发布到UI线程消息队列会发生什么。然后,您的计算会阻止UI线程,从而阻止处理队列中的消息。第二个setContentView()
向队列发送另一条消息。当控件最终返回到消息循环时,两个消息都会被处理,您将通过上次调用setContentView()
来设置布局。
对于繁重的计算,请使用单独的线程。例如,IntentService
或AsyncTask
使线程更容易。
答案 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操作。
希望它可以帮助某人。