服务器的机器人屏幕截图线程在读取客户端InputStream后被阻塞

时间:2014-10-24 15:01:49

标签: java android multithreading sockets

我已经编写了一个简单的服务器(java)/客户端(android)...我正在使用Robot从服务器捕获屏幕截图并使用套接字连接将其转发给客户端...这很好 - 恰好一次 - 但我需要随意重复这个动作......

我相当肯定如果指向正确的方向我可以设置更新屏幕截图的方法 - 但我不明白为什么我的线程挂起......

在客户端发布runnable via handler只会在初始BitmapFactory.decodeStream调用之后返回一个空Bitmap ...

我上下搜索过,无法找到这种行为的原因或任何迹象表明如何解决这个问题......

SERVER SCREENSHOT THREAD:

 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);

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

代码没有错误,服务器端截屏线程将采取四个截图,客户端只读取一个,然后服务器线程将挂在写入行...

我迷失了......请帮助......

1 个答案:

答案 0 :(得分:0)

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

1)取消包含输入流和bitmapfactory调用的线程

2)使用异步任务重新初始化套接字并调用新线程来解码新传入的图像......

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