10

我有一个手写识别应用程序 - 用户用手指绘制,应用程序识别字符。识别引擎在具有最低可能优先级的工作线程中运行 - Thread.MIN_PRIORITY。这是一个纯粹的 CPU/内存算法,没有任何 I/O。尽管如此,当线程正在积极工作时,UI 变得相当不稳定。手指敲击需要明显延迟才会出现。我还注意到触摸事件丢失了。

这不正是线程应该帮助避免的吗?为什么 UI 线程缺乏 CPU?如何说服系统将工作线程视为低优先级后台线程?

看起来系统正在(自愿或由于 CPU 饥饿)在invalidate()和之间引入延迟onDraw()。我能以某种方式降低延迟吗?

在相对较旧的硬件上进行测试 - 使用 Android 2.1 的 HTC Magic。

4

3 回答 3

4

有同样的问题,所以我做了我的线程:

  1. 处理大量工作后的 Thread.yield()。

  2. 以最少 500 毫秒的间隔发布到 UI 线程的有限更新(导致重绘少得多)。

  3. 让工作人员处理优先的数据桶,这侧重于更新用户当前正在与之交互的视图。

现在整个 UI 真的很懒惰,但没有滞后。

这是我的工人的调度方法的样子(实际工作由 Process 方法完成):

//--low priority
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

//--as long as there's more work to do, and not cancelled--
while (mPriorityBuffer.hasNext() && !isCancelled()) {

    //--get the work with highest priority--
    Work next = mPriorityBuffer.getNext();

    //--do work--
    Update u = mProcessor.process(next);

    // collect updates for main thread
    mUpdates.push(u);

    long timeNow = Calendar.getInstance().getTimeInMillis();
    if(timeNow - timeLast > 500){
        //--its been quite a while now, update ui--
        postUpdatesToMainThread();
        timeLast = timeNow;
    }

    //--let UI thread work on updates--
    Thread.yield();
}
于 2012-11-06T16:26:39.193 回答
2

尝试Thread.sleep(1) 在字符识别方法中加入主循环

@Override
public void run() {
  while (!recognited) {

    //do some script

    try {
      Thread.sleep(1);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

这种睡眠让虚拟机可以提前并经常恢复其他线程

于 2012-11-06T16:07:48.283 回答
1

您的 GUI 线程可能会加载触摸事件,如果是这样,那么解决方案是在 UI 线程上引入几毫秒的等待并提升您的工作线程。更多关于这里:

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/Oe6k1_bm38o

另外,也许您正在处理太多数据,例如实际上没有发生任何运动,或者运动不够显着。

于 2012-11-06T16:19:17.160 回答