【问题标题】:Android ImageView not showing received images from socket connectionAndroid ImageView 不显示从套接字连接接收到的图像
【发布时间】:2012-12-01 04:18:18
【问题描述】:

我试图在一个 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 应用程序接收到的第一张图像正确显示后,下一个接收到的图像(正确接收)没有显示,并且图像视图对象显示为空白。

有什么解决这个问题的建议/想法吗?

提前感谢您提供的任何帮助。

编辑:

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);
               }
            }
         }
    }
 }

【问题讨论】:

    标签: android sockets imageview


    【解决方案1】:

    听起来您遇到的问题是在接收数据后将数据解码为正确的图像。

    我可能建议不要使用Drawable.createFromStream(),而是使用BitmapFactory.decodeStream(),或者先手动将数据下载到byte[],然后使用BitmapFactory.decodeByteArray()。有时,如果前者在接收数据时无法充分跟上解码器的速度,则后者很有用。

    您当前使用的方法实际上最终调用了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)msg.obj; imageSock.setImageBitmap(BitmapFactory.decodeStream(d2));”它根本不起作用。事实上,该应用程序不再回答。我设置错了吗?
    • 您认为以stackoverflow.com/questions/11926421/… 这篇帖子的方式获取信息对我的目的有帮助吗?
    • 我仍然会在后台线程上进行解码,只是传回 Bitmap 而不是 Drawable。将代码更改为在主线程上调用 decodeStream() 现在可能会导致 AND,因为该操作需要很长时间。
    • 感谢您的回答,我已将代码更改为显示原始问题编辑部分的代码,但结果与原始帖子中的基本相同。另外,我正在使用 Gingerbread,这会影响代码吗?如果您有任何进一步的想法,我将不胜感激。
    猜你喜欢
    • 2015-03-22
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2014-03-25
    • 2019-01-26
    • 1970-01-01
    相关资源
    最近更新 更多