Android ImageView不显示从套接字连接接收到的图像

Android ImageView不显示从套接字连接接收到的图像,android,sockets,imageview,Android,Sockets,Imageview,我试图在Android应用程序中显示两个连续的图像,它们是通过套接字接收的(来自使用sendfile的C程序)。发件人代码似乎工作正常,我在Android代码方面有问题 Android应用程序中的部分代码如下: public class DisplayNewActivity extends Activity { ... @Override public void onCreate(Bundle savedInstanceState) { ....

我试图在Android应用程序中显示两个连续的图像,它们是通过套接字接收的(来自使用sendfile的C程序)。发件人代码似乎工作正常,我在Android代码方面有问题

Android应用程序中的部分代码如下:

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));“它根本不工作。事实上,该应用程序不再响应。我是不是设置错了?你认为以这篇文章的方式获取信息对我的目的有帮助吗?我仍然会在后台线程中进行解码,只是将
位图
传递回,而不是
可绘制的
。在主线程上将代码更改为call
decodeStream()
,现在可能会导致错误,因为该操作需要很长时间。感谢您的回答,我已将代码更改为显示原始问题编辑部分的代码,但结果与原始帖子中的结果基本相同。另外,我正在使用姜饼,这会影响代码吗?如果你有任何进一步的想法,我将非常感激。
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);
               }
            }
         }
    }
 }