读取客户端输入流后,java服务器的Robot屏幕截图线程被阻塞
我已经编写了一个简单的服务器(java)/客户端(安卓)。。。我正在用Robot从服务器上截取一个屏幕截图,并使用socket连接将其转发到客户端。。。这很好——正好一次——但我需要随意重复这个动作
我很确定,如果指向正确的方向,我可以设置更新屏幕截图的方法——但我不明白为什么我的线程挂起了
在客户端发布可运行的via处理程序只会在初始BitmapFactory之后返回空位图。解码流呼叫
我上下搜索,找不到这种行为的原因,也找不到任何修复方法的迹象
服务器截图线程:
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() {
安卓.os.Process
.setThreadPriority(安卓.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上。写(截图,“JPG”,出来)
输入和输出流定义为客户端和服务器中的字段,它们在socket连接上初始化
代码没有抛出错误,服务器端截图线程将截取四个截图,只有一个被客户端读取,然后服务器线程将挂起在写入行
我迷路了。。。请帮帮我
# 1 楼答案
Android的BitmapFactory。decodestream(inputstream)方法仅允许从输入流解码单个图像;虽然这可能不是最有效的解决方法,但我通过以下方式解决了这个问题:
1)取消包含输入流和bitmapfactory调用的线程
2)使用异步任务重新初始化套接字,并调用新线程来解码新传入的图像
这是可行的,但同样,我希望您能就如何提高该过程的效率提出任何建议,例如如何使用其他方法对传入图像进行解码