2012-12-01 30 views
0

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

在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对象。

任何建议/想法来解决这个问题?

在此先感谢您提供的任何帮助。

编辑:

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

回答

0

这听起来像您有在收到后的数据转换成适当的图像进行解码的问题。

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

您当前使用的方法实际上最终调用BitmapFactory.descodeResourceStream(),它用于从本地res /包中读取图像数据,而不是从远程套接字读取图像数据。

+0

嗨,谢谢你的回答。从我发布的代码中,我改变了行“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));”它根本不起作用。事实上,该应用程序不再回答。我是否设置错了? – gus

+0

你认为以这种方式获取信息的方式http://stackoverflow.com/questions/11926421/sending-multiple-images-over-socket#comment15883123_11926455确实会帮助我达到我的目的吗? – gus

+0

我仍然保留在后台线程上的解码,只是传回'Bitmap'而不是'Drawable'。更改代码以在主线程上调用decodeStream()可能现在会导致AND,因为该操作需要很长时间。 – Devunwired