当工作线程工作时,UI变得不连贯

Sev*_*yev 10 user-interface multithreading android touch

我有一个手写识别应用程序 - 用户用手指绘制,应用程序识别字符.识别引擎在具有最小可能优先级的工作线程中运行 - Thread.MIN_PRIORITY.这是一个纯粹的CPU /内存算法,没有任何I/O. 但是,当线程正在运行时,UI变得相当不稳定.手指笔划会出现明显的延迟.我也注意到触摸事件迷失了.

这究竟是什么线程应该有助于避免?为什么UI线程缺乏CPU?如何说服系统将工作线程视为低优先级后台线程?

看起来系统正在引入(心甘情愿或因为CPU饥饿而导致)invalidate()和之间的延迟onDraw().我可以以某种方式降低延迟吗?

测试相对较旧的硬件 - 搭载Android 2.1的HTC Magic.

S.D*_*.D. 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();
}
Run Code Online (Sandbox Code Playgroud)