我已经编写了一个简单的服务器(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) 使用异步任务来重新初始化套接字,并调用要建立的新线程来解码新的传入映像。。。
这是有效的,但我再次感谢任何关于如何提高处理效率的建议,例如如何使用其他方法解码传入图像