繁体   English   中英

当工作线程工作时,UI变得不稳定

[英]When the worker thread works, UI becomes choppy

我有一个手写识别应用程序-用户用手指画画,该应用程序可以识别字符。 识别引擎在工作线程中运行,该工作线程具有最小的优先级Thread.MIN_PRIORITY 这纯粹是CPU /内存算法,没有任何I / O。 尽管如此,当线程处于活动状态时,UI变得非常不稳定。 手指笔触需要明显的延迟才能出现。 我也注意到触摸事件迷路了。

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

看来系统正在引入(有意或由于CPU饥饿) invalidate()onDraw()之间的延迟。 我可以以某种方式降低延迟吗?

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

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

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

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

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

    //do some script

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

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

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

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

另外,也许您正在处理过多的数据,例如实际上没有发生移动或移动不够明显。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM