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.
有同样的问题,所以我做了我的线程:
处理完一大块工作后的 Thread.yield() 。
以最小 500 毫秒的间隔发布到 UI 线程的有限更新(导致更少的重新绘制)。
让工作人员处理优先的数据桶,重点是更新用户当前正在交互的视图。
现在整个 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)
| 归档时间: |
|
| 查看次数: |
3080 次 |
| 最近记录: |