读取客户端输入流后服务器的机器人屏幕截图线程被阻止



我已经编写了一个简单的服务器(java)/客户端(android)。。。我正在用Robot从服务器上捕获一张屏幕截图,并使用套接字连接将其中继到客户端。。。这很好——正好一次——但我需要随意重复这个动作。。。

我很确定,如果指向正确的方向,我可以设置更新屏幕截图的方法——但我不明白为什么我的线程挂起了。。。

在客户端发布可运行的via处理程序仅在初始BitmapFactory.decodeStream调用后返回空位图。。。

我上下搜索了一遍,找不到这种行为的原因,也找不到任何解决方法…

服务器屏幕截图线程:

 private void screen(final Socket socket){
    Thread Shot1 = new Thread(){
        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            System.out.println("entered run");
            try {
            while(true){

                Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
                Rectangle shotArea = new Rectangle(defaultToolkit
                    .getScreenSize());
                BufferedImage screenShot = robot
                    .createScreenCapture(shotArea);
                ImageIO.write(screenShot, "JPG", out);

                out.flush();

                Thread.sleep(2000);
            }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };
    Shot1.start();
}

客户端读取线程:

 Downloader = new Thread() {
             @Override
             public void run() {
                 android.os.Process
                    .setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
                 Bitmap bit = null;
                 try {
                     in = socket.getInputStream();
                 } catch (IOException e1) {
                     e1.printStackTrace();
                 }
                 try {
                     if (Thread.interrupted()) {
                         Log.i("thread interrupted", "true");
                         throw new InterruptedException();
                     }
                     if (socket != null) {
                         bit = BitmapFactory.decodeStream(in);
                         Log.i("bitmap", "decoded");

                     } else if (socket == null) {
                         Log.i("socket", "null");
                     }
                 } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
                 if (bit != null && bit != temp //temporary bitmap for comparison only{
                          Log.i("bitmap", "not null and not temp");
                          threadMsg(bit);

                 }
             }
             private void threadMsg(Bitmap bit) {
                 if (bit != null) {
                     Message msg = mHandler.obtainMessage();
                     msg.what = NEED_TO_SET_BITMAP_FROM_SCREENSHOT;
                     Bundle b = new Bundle();
                     b.putParcelable("Bitmap", bit);
                     msg.setData(b);
                     mHandler.sendMessage(msg);
                 }
             }
         };

它挂在ImageIO.write(screenShot,"JPG",out);

输入和输出流被定义为客户端和服务器中的字段,它们在套接字连接上初始化。

代码没有抛出错误,服务器端的屏幕截图线程将进行四次屏幕截图,只有一次被客户端读取,然后服务器线程将挂在写入行。。。

我迷路了。。。请帮忙。。。

Android的BitmapFactory.decodestream(inputstream)方法只允许从输入流中解码单个图像;虽然这可能不是最有效的解决方案,但我通过以下方式解决了问题:

1) 取消包含输入流和位图工厂调用的线程

2) 使用异步任务来重新初始化套接字,并调用要建立的新线程来解码新的传入映像。。。

这是有效的,但我再次感谢任何关于如何提高处理效率的建议,例如如何使用其他方法解码传入图像

最新更新