使用Android ADK进行线程阻止

时间:2012-02-23 23:14:13

标签: android adk

我试图从配件的InputStream读取字节而不阻塞线程(如果可能的话)。

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

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

编辑:

我设置AsyncTask在后​​台进行阅读(虽然我知道我应该使用一个真正的线程进行扩展任务),并且它工作正常。

我想真正的问题是,通过“阅读”不断阻止后台线程是否会对性能造成任何损害?呼叫?现在没有效果,但应用程序很快就会变得非常密集,我希望至少使通信尽可能轻松。

BufferedInputStream会减轻负荷吗?这有它自己的available()方法。

2 个答案:

答案 0 :(得分: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 :(得分:0)

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

Runnable

AsyncTask

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

TimerTask