Android ImageView不显示从套接字连接接收到的图像
我试图在Android应用程序中显示两个连续的图像,它们是通过套接字接收的(来自使用sendfile的C程序)。发件人代码似乎工作正常,我在Android代码方面有问题 Android应用程序中的部分代码如下:Android ImageView不显示从套接字连接接收到的图像,android,sockets,imageview,Android,Sockets,Imageview,我试图在Android应用程序中显示两个连续的图像,它们是通过套接字接收的(来自使用sendfile的C程序)。发件人代码似乎工作正常,我在Android代码方面有问题 Android应用程序中的部分代码如下: public class DisplayNewActivity extends Activity { ... @Override public void onCreate(Bundle savedInstanceState) { ....
public class DisplayNewActivity extends Activity {
...
@Override
public void onCreate(Bundle savedInstanceState) {
....
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Drawable d2;
d2 = (Drawable)msg.obj;
imageSock.setImageDrawable(d2); // to set the arrived image in the imageshow object
}
};
...
cThread = new Thread(new ClientThread());
rThread = new Thread(new RcvThread());
cThread.start();
}
public class ClientThread implements Runnable {
public void run() {
// thread used for socket connection.
...
rThread.start(); // once the connection has been established
...
}
}
@SuppressLint("HandlerLeak")
public class RcvThread implements Runnable {
public void run() {
while (connected) {
try {
InputStream inputStream = socket.getInputStream();
Drawable d = Drawable.createFromStream(inputStream, null);
Message msg = new Message();
msg.obj = d;
mHandler.sendMessage(msg);
} catch (Exception e) {
Log.e("SocketConnectionv02Activity", "C: ErrorRCVD", e);
}
}
}
}
}
我面临的问题是,在Android应用程序接收到的第一幅图像正确显示后,下一幅图像(正确接收)将不显示,并留下显示空白的imageview对象
有没有解决这个问题的建议/想法
提前感谢您提供的任何帮助
编辑:
听起来您遇到的问题是在接收数据后将其解码为正确的图像 我可能建议不要使用
Drawable.createFromStream()
,而是使用BitmapFactory.decodeStream()
,或者先手动将数据下载到字节[]
中,然后使用BitmapFactory.decodeBytarray()
。有时,如果前者在接收数据时不能充分跟上解码器,则后者是有用的
您当前使用的方法实际上最终调用了
BitmapFactory.descodeResourceStream()
,该方法用于从本地res/包中读取图像数据,而不是从远程套接字读取图像数据。您好,感谢您的回答。根据我发布的代码,我将“InputStream InputStream=socket.getInputStream();Drawable d=Drawable.createFromStream(InputStream,null);”改为“DataInputStream d=new DataInputStream(socket.getInputStream());”和“Drawable d2;d2=(Drawable)msg.obj;imageSock.setImageDrawable(d2);”改为“DataInputStream d2;d2=(DataInputStream=(DataInputStream))msg.obj;imageSock.setImageBitmap(BitmapFactory.decodeStream(d2));“它根本不工作。事实上,该应用程序不再响应。我是不是设置错了?你认为以这篇文章的方式获取信息对我的目的有帮助吗?我仍然会在后台线程中进行解码,只是将位图
传递回,而不是可绘制的
。在主线程上将代码更改为calldecodeStream()
,现在可能会导致错误,因为该操作需要很长时间。感谢您的回答,我已将代码更改为显示原始问题编辑部分的代码,但结果与原始帖子中的结果基本相同。另外,我正在使用姜饼,这会影响代码吗?如果你有任何进一步的想法,我将非常感激。
public class DisplayNewActivity extends Activity {
...
@Override
public void onCreate(Bundle savedInstanceState) {
....
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Bitmap d2;
d2 = (Bitmap)msg.obj;
imageSock.setImageBitmap(d2); // to set the arrived image in the imageshow object
}
};
...
cThread = new Thread(new ClientThread());
rThread = new Thread(new RcvThread());
cThread.start();
}
public class ClientThread implements Runnable {
public void run() {
// thread used for socket connection.
...
rThread.start(); // once the connection has been established
...
}
}
@SuppressLint("HandlerLeak")
public class RcvThread implements Runnable {
public void run() {
while (connected) {
try {
DataInputStream in = new DataInputStream(socket.getInputStream());
Bitmap d = BitmapFactory.decodeStream(in);
Message msg = new Message();
msg.obj = d;
mHandler.sendMessage(msg);
} catch (Exception e) {
Log.e("SocketConnectionv02Activity", "C: ErrorRCVD", e);
}
}
}
}
}