2012-02-23 53 views
1

我试图从附件的InputStream中读取字节而不阻塞线程(如果可能)。使用Android ADK阻止线程

通常,我会将read(buffer)调用包装在if available()中,但available()抛出异常(即使read()在InputStream上工作正常)。

是否有任何其他解决方案可以最大限度地减少线程阻塞?

编辑:

我设置AsyncTask做背景阅读(虽然我知道我应该使用一个真正的线程扩展的任务),它工作正常十岁上下。

我想真正的问题是,有没有一个后台线程不断被'读取'调用阻塞的性能损害?现在没有任何效果,但应用程序很快就会变得非常密集,我希望至少使通信尽可能轻便。

请问BufferedInputStream会降低负载吗?这是它自己的available()方法。

+0

为什么不直接旋转起来'Thread'处理读操作的吗?然后,只要实际上有数据要处理,就可以回调其他对象。 – aroth 2012-02-23 23:18:32

回答

1

在回答您的编辑问题,没有,有来自具有受阻于read()调用后台线程没有性能损失。基本上就好像后台线程正在睡觉。然而,如果你继续产卵后台线程,并且你永远不允许所有人都坐在read()上,那么你的手中就会有一个非常严重的内存泄漏。它不会降低速度等方面的性能,但最终会导致应用程序崩溃。

所以是的,重要的是要确保后台线程最终终止(或至少保证你的代码不会试图添加新的,如果现有的不终止)。

这应该处理原始问题:

public interface StreamDataHandler { 
    public void handleData(byte[] buffer, int numBytes); 
    public void readFailedWithError(Exception ex); 
} 

public class DataReader extends Thread { 
    private StreamDataHandler handler; 
    private InputStream input; 

    public DataReader(InputStream in, StreamDataHandler handler) { 
     super(); 
     this.input = in; 
     this.handler = handler; 
    } 

    @Override 
    public void run() { 
     int numRead = 0; 
     byte[] buffer = new byte[1024]; 
     try { 
      while ((numRead = input.read(buffer)) != -1) { 
       if (this.handler != null && numRead > 0) { 
        this.handler.handleData(buffer, numRead); 
       } 
      } 
     } 
     catch (Exception e) { 
      if (this.handler != null) { 
       this.handler.readFailedWithError(e); 
      } 
     } 
    } 
} 
+1

在文档中,当read()命中时,它应该放出-1,但是我的问题是,当数据用完时,它永远不会返回,只是无限地阻塞线程。 – paulbovbel 2012-02-24 00:03:07

+0

因此,然后在'DataReader'中添加一个'timeout()'方法,它执行一些类似于'input.close();'的操作,并且如果在某个合理的情况下没有对'handleData()'的调用,多少时间。 – aroth 2012-02-24 00:06:25

+0

这就是我所需要的。谢谢! – paulbovbel 2012-02-24 00:17:50

0

您可以尝试使用Runnable或AsyncTask来解决任何线程阻塞问题。

Runnable

AsyncTask

或者你可以看看为什么异常被抛出。您可以捕获异常,然后重复TimerTask调用'available()',直到成功为止。

TimerTask