我已经编写了一个简单的服务器(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);
输入和输出流在客户端和服务器中定义为字段,它们在套接字连接上初始化。
代码没有错误,服务器端截屏线程将采取四个截图,客户端只读取一个,然后服务器线程将挂在写入行...
我迷失了......请帮助......
答案 0 :(得分:0)
Android的BitmapFactory.decodestream(输入流)方法只允许从输入流中解码单个图像;虽然它可能不是最有效的解决方法,但我通过以下方式解决了这个问题:
1)取消包含输入流和bitmapfactory调用的线程
2)使用异步任务重新初始化套接字并调用新线程来解码新传入的图像......
这种方法有效,但我再次感谢任何有关如何提高处理效率的建议,例如如何使用其他方法解码传入的图像