2012-12-01 2 views
0

sendfile을 사용하는 C 프로그램에서 소켓을 통해 수신되는 두 개의 연속 이미지를 Android 앱에 표시하려고합니다. 보낸 사람 코드가 제대로 작동하는 것 같아서 안드로이드 코드 쪽에서 문제가 있습니다.Android ImageView가 소켓 연결에서 수신 된 이미지를 표시하지 않습니다.

안드로이드 응용 프로그램의 코드의 일부는 다음

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

내가 직면하고 문제는 안드로이드 응용 프로그램에서 수신 된 첫 번째 이미지가 제대로 표시 한 후, 그 다음 하나받은 것입니다 (이 가 정확하게 수신 됨)은 표시되지 않고 공백을 나타내는 이미지 뷰 객체를 떠난다.

이 문제를 해결하기위한 제안이나 아이디어가 있으십니까?.

당신이 제공 할 수있는 도움에 미리 감사드립니다.

EDIT :

그것은 그것을받은 후 적절한 화상으로 데이터를 디코딩하는 데에 문제 같은데
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 = 새 DataInputStream (socket.getInputStream());" 및 "Drawable d2; d2 = (Drawable) msg.obj; imageSock.setImageDrawable (d2);" to "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

나는 백그라운드 스레드에서 계속 디코딩을 유지하고'Drawable' 대신'Bitmap'을 다시 전달했습니다. 메인 쓰레드에서'decodeStream()'을 호출하도록 코드를 변경하면 아마 그 작업이 오랜 시간이 걸리기 때문에 AND를 유발할 수 있습니다. – Devunwired

관련 문제