java– 在其他线程中阻塞我的UI线程的IO *** 作?

java– 在其他线程中阻塞我的UI线程的IO *** 作?,第1张

概述因此,IO不会阻止我的Android应用程序中的UI线程,我正在尝试将文件写入 *** 作移动到单独的线程中.这是我用来启动低优先级线程从代码缓冲区写入1Mb的代码:Threadt=newThread(newRunnable(){@Overridepublicvoidrun(){Process.setThreadPriority(Process.THREAD

因此,IO不会阻止我的Android应用程序中的UI线程,我正在尝试将文件写入 *** 作移动到单独的线程中.这是我用来启动低优先级线程从代码缓冲区写入1Mb的代码:

Thread t = new Thread(new Runnable(){  @OverrIDe  public voID run()  {    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);      try      {        fileOutputStream fos = new fileOutputStream(filename));        try        {          final java.nio.channels.fileChannel outChannel = fos.getChannel();          outChannel.write(byteBuffer);          fos.getFD().sync();        }        finally        {          if (fos != null)            fos.close();        }      }    catch (Exception e)    {      e.printstacktrace();    }}});t.setPriority(Thread.MIN_PRIORITY);t.start();

当某些UI事件发生时,这些线程在我的应用程序中启动.不幸的是,我有时会注意到大量的滞后.我的UI将每10个左右冻结约2秒钟,我开始/完成上述线程之一.如果我注释掉线程代码,这些延迟就会消失.

我该怎么做才能阻止这个IO *** 作阻止我的UI线程?

我不知道现在要做什么来诊断问题.我的理解是,当“outChannel.write”发生时,IO线程将被阻塞,因为它正在等待IO *** 作完成,这意味着我的UI线程将立即接管.是否这种情况下写 *** 作实际上需要大量cpu功率?

编辑:

使用StrictVIEw(我确定因为它在我首先修复的UI线程中发现了一些无关的IO问题),我可以确认我的IO线程中没有IO.

运行tracevIEw的结果非常令人费解. UI问题是,当我执行拖放 *** 作时,每10次左右我执行此 *** 作,设备似乎冻结约0.5到1秒.你拖动的东西会冻结,延迟后最终会跳到你手指的位置.在tracevIEw中,我一直拖拉,直到发生这种情况.对于在tracevIEw中发生这种情况的情况,我的后台线程没有运行,但是突然阻塞大约1秒,我的UI线程上通常快速调用的 *** 作大约需要花费x10来执行.例如,对.drawBitmap(具有固定大小的位图)的调用显示为每次执行~0.2s时执行相同的.drawBitamp调用占用此时间的十分之一.我可能只是读错了,但我不知道从这里去哪里或者寻找什么.

解决方法:

What can I do to stop this IO operation from blocking my UI thread?

I / O *** 作不会直接阻塞主应用程序线程.您在主应用程序线程上运行的代码阻止了主应用程序线程.您需要确定在主应用程序线程上运行的代码被绑定的位置.为此,请使用调试器或Log.d()语句等.

例如,在大多数AndroID设备上,文件系统是YAFFS2,它具有每分区全局锁定.引用Brad Fitzpatrick:

yaffs has a giant lock around the whole filesystem code, so even a tiny stat() can block for seconds if the disk is otherwise being hammered by something else (during boot, heavy sync, etc).

因此,如果您在后台线程中将文件系统绑定了几秒钟,主应用程序线程将无法执行自己的文件I / O.也许这就是绊倒你,在这种情况下,AndroID 2.3中的StrictMode可以帮助您找出困难的根源.

What’s the point of moving it to another thread then?

关键是将闪存I / O从主应用程序线程中移开.全闪存I / O.

FWIW,AndroID将出现在ext4设备上(例如,Nexus S),这个问题就会消失……尽管你需要担心sync()调用.在YAFFS2上,sync()基本上不太重要,因为它几乎没有缓冲.

总结

以上是内存溢出为你收集整理的java – 在其他线程中阻塞我的UI线程的IO *** 作?全部内容,希望文章能够帮你解决java – 在其他线程中阻塞我的UI线程的IO *** 作?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1109392.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存