2014-10-16 57 views
0

我想从android手机的桌面接收图像流。当我在我的线程中放入decodeStream()方法,然后将decodestream()放入runOnuiThread()以显示在imageView中时,它需要7秒多的时间。但是,当我尝试直接从资产读取图像并转换为输入流,然后decodeStream()时,它可能需要500ms,我不知道它为什么会发生。图像是100K。为什么DecodeStream(stream)在线程中比在主线程中花费更长的时间?

 Thread thread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      SocketConnect = new socketConnect(); 
      SocketConnect.connectsocket("134.129.125.126", 8080); 
      while (true) { 
       data = new byte[2048 * 2048]; 

       try { 
        read = SocketConnect.getInputStream().read(data, 0, 
          data.length); 
        input = SocketConnect.getInputStream(); 
        System.out.println("getInputStream()"); 
        bitmap = BitmapFactory.decodeStream(input); 
        System.out.println("decodestream()"); 

       } catch (Exception e) { 
        // TODO: handle exception 
        e.printStackTrace(); 
        System.out.println(e); 
       } 
       runOnUiThread(new Runnable() { 
        public void run() { 

         image.setImageBitmap(bitmap); 
         System.out.println("setImage at less than 500"); 

        } 
       }); 
      } 
     } 
    }); 
    thread.start(); 

客户端应该在5秒内发送图像。 如果我尝试从资产中读取相同的图像,则立即显示图像。

try { 
    inputasset=getAssets().open("good1.jpg"); 
    Bitmap bit = BitmapFactory.decodeStream(inputasset);  
    image.setImageBitmap(bit); 
    } catch (IOException e) { 
     TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

socketConnect类

public class socketConnect { 
    private Socket clientSocket; 
    private InputStream input; 
    private Bitmap bMap; 

    public InputStream getInputStream() { 
     return input; 
    } 

    public void connectsocket(String ipString, int port) 

    { 
     System.out.println("starts"); 

     try { 
      // clientSocket = new Socket("134.129.125.172",8080); 
      System.out.println("starts"); 
      clientSocket = new Socket(ipString, port); 

      System.out.println("AsyncTask: Connect to 134.129.125.126"); 
      input = clientSocket.getInputStream(); 

      System.out.println("AsyncTask: get the inputStream"); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 
+0

现在我正在尝试使转换不会延迟,为什么延迟只发生在线程中。 – user3799770 2014-10-16 20:53:50

回答

3
   read = SocketConnect.getInputStream().read(data, 0, 
         data.length); 
       input = SocketConnect.getInputStream(); 
       System.out.println("getInputStream()"); 
       bitmap = BitmapFactory.decodeStream(input); 
       System.out.println("decodestream()"); 

您从输入流中读取数据,然后你问BitmapFactory从输入流中读取数据。但你已经阅读过它!删除对read的呼叫 - 您正在从BitmapFactory中窃取数据。

+0

另外它看起来像是从远程服务器下载图像,而资产文件夹正好在设备上。无论如何,这将需要更长的时间。 – DeeV 2014-10-16 20:55:00

+0

实际上,在删除read()之后,它将不起作用。 – user3799770 2014-10-16 21:01:20

+0

@ user3799770一次发现一个错误。 – 2014-10-16 21:02:03

0

我的猜测是,服务器端不能正常发送文件已达到的结尾。我以前遇到过这种情况,因为Web服务器实现可能不会告诉您它发送的文件的长度。如果它没有设置内容长度,那么输入流会一直试图读取。我的猜测是,它需要几分钟,因为这是默认套接字超时值。

因此,来自套接字的输入流会尽可能多地读取数据并持续等待更多数据。等待几分钟后(尽管默认超时时间通常是5分钟),套接字关闭,您将获得图像。

我不完全确定内容长度会有帮助,另一种选择可能是服务器在所有数据发送完毕后关闭连接。

很明显,如果您尝试流式传输新图像,则需要做一些与您不同的事情。也许让你的服务器发送一个读者解释的文件头。此标头可能包含正在发送的数据的长度,然后您写入的客户端在达到此长度后停止读取。在这种情况下,您需要将图像数据读入缓冲区,然后让BitmapFactory读取缓冲区而不是流。

另一种方法是让服务器在为每个映像发送数据后关闭连接,然后客户端重新连接以获取下一个。

底线,并不是所有的InputStreams都是相等的,并且SocketInputStream不知道何时关闭而没有内容长度或套接字被关闭。

相关问题