【问题标题】:Is there a callBack to SetContentView in Android?Android中是否有回调SetContentView?
【发布时间】:2014-02-16 09:09:20
【问题描述】:

在 Android 中是否有任何回调 setContentView,因为我在 setContentView 行之后执行繁重的操作,并且它似乎跳过了该 setContentView。

所以我正在考虑将heavyOperation移到setContentView的callBack。

谢谢

编辑:

伪代码:

录音完成 SetContentView(1) //显示没有按钮的“处理中”屏幕 FFT分析 SetContentView(2) //关于 FFT 分析 DONE。

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

编辑#2: 我在另一个Thread中做了繁重的操作,在繁重的操作完成后使用Handler发送Message,将其视为callBack。

感谢大家的帮助

【问题讨论】:

  • setContentView 永远不会被跳过。你的意思是延迟?
  • 是的,可能延迟了。有办法吗?
  • 在 Java 中,函数的行永远不会被跳过。
  • 我知道,但屏幕没有渲染。
  • 此 FFT 何时发生以及在何处发生?向我们展示代码?

标签: android callback views


【解决方案1】:

简短回答:setContentView 没有回调。

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

如果您正在执行更繁重的操作并想要更新 UI,那么您可以使用 ServiceBroadCastReceiver 来完成。

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

【讨论】:

  • 不,我正在对声音文件进行 FFT。录制声音后,我想不按任何按钮更改屏幕,然后执行 FFT 分析,并在 FFT 完成后再次更改视图。但在我的情况下,它会跳过“无按钮”屏幕并直接移动到 FFT 分析屏幕的末尾
【解决方案2】:

heavy work 应在asynk tasksserviceother threads 上完成

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我的秘诀。

      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(); 行设置一个断点可能会有所帮助。

      【讨论】:

        【解决方案5】:

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

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

        希望对某人有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-06
          • 1970-01-01
          相关资源
          最近更新 更多