0

我正在编写一个与摩托罗拉 EMDK 接口的 Android 应用程序,并且遇到了计时/线程问题。我有一个活动,它添加一个片段以使用 EMDK 执行一个非常特定的功能,显示一个屏幕告诉用户正在发生什么,然后在大约 15 秒后被活动清理。

我注意到在 EMDK 操作发生(在这种情况下设备底座正在解锁)与显示“底座现已解锁”的 GUI 之间存在 1-2 秒的延迟。

我已经对 Android 如何处理在屏幕上绘制片段进行了一些研究,并且我能找到的所有内容都表明 onResume 被称为“当片段变得可见时”。然而,这与我的经验不符。根据我的理解,下面的代码应该可以工作,应该绘制屏幕,​​然后调用 EMDKManager.getEMDKManager() 方法,该方法构造一个指向 EMDK 服务的指针并创建一个新线程来执行解锁:

@Override  
public void onResume() {  
      super.onResume();  
      EMDKManager.getEMDKManager(getActivity().getApplicationContext(), this);  
}  

它看起来更像是仅在 onResume() 完全完成后才绘制屏幕,​​即 EMDKManager.getEMDKManager() 也完成了它的调用。

由于该片段是该方法的第二个参数所需的 EMDKListener 对象,因此我正在努力寻找一种正确线程的方法。我需要先绘制 GUI,或者在底座解锁的同时绘制。

是否有任何其他方法可以被覆盖或与之交互以获得片段的 onViewDrawn() 事件的等价物?

非常感谢。

4

2 回答 2

0

尽管我非常担心内存使用/泄漏,但我这样做是为了让时间正确:

private EMDKManager.EMDKListener getThis() {

    return this;
}

private Runnable initEMDK = new Runnable() {
    @Override
    public void run() {

        EMDKManager.getEMDKManager(getActivity().getApplicationContext(), getThis());
    }
};

@Override
public void onResume() {

    super.onResume();
    Log.v(LOGTAG, "Starting");
    new Thread(initEMDK).start();
}

我觉得有一种执行 getThis() 方法的标准方法。如果你知道,我很想知道。

谢谢你。

于 2015-07-17T17:13:22.007 回答
0

所有的生命周期方法onCreate()onResume() onStop()都由主线程调用,主线程也负责绘制UI。

通过在这些方法中执行长操作,您可以阻止 UI 线程处理触摸输入以及绘制应用程序

你可以通过这样做在另一个线程上开始你的长操作:

new Thread(new Runnable() {
    @Override
    public void run() {
       // do long operations here
    }
}.start();

请注意,如果该操作想要更新 UI 组件,它必须在 UI 线程上完成,您可以通过将 runnable 传递给活动来完成

activity.runOnUiThread(new Runnable() {
    public void run() {
        // do UI updating but, do not block it here
    }
});

(或者你可以创建一个处理程序,如果它是一个Service或者你想延迟那些可运行的)

于 2015-07-17T16:57:32.010 回答