2011-03-18 3 views
0

tcp를 통해 비트 맵을 전송하는 작은 클라이언트 - 서버 애플리케이션을 작성했습니다. 서버 부분은 매력처럼 작동하지만 클라이언트 측에서는받은 비트 맵을 표시하는 방법을 모르겠습니다. 클라이언트 백엔드는 새 사진에 액티비티의 메소드가 수신 될 때마다 호출하며 비트 맵을 최대 25fps로 업데이트하고 표시해야합니다. 가장 좋은 솔루션은 무엇입니까?안드로이드의 빠른 디스플레이 비트 맵

직접보기를 작성했지만 setContentView 을 호출하면 비트 맵이 표시되지 않고 화면이 검은 색으로 유지되어 서버가 닫힐 때까지 한 이미지가 올바르게 표시됩니다.

this.image = (ImageView) findViewById(R.id.imageView1); 

public void setImage(BufferedImage bufImage) { 
    if (bufImage.hasBitmap()) { 
     this.image.setImageBitmap(bufImage.getBitmap()); 
    } 
} 

이 image.invalidate와 심지어

() 아무것도 할 때까지 일어나지 않는다 (내가 올바른 비트 맵을 유지하는 자신의 BufferedImage 클래스를 썼다) : 난 이런 걸 시도 서버가 연결을 닫습니다.

답변

0

사용자 인터페이스 스레드에서 네트워크 IO를하고있는 것처럼 들릴 수 있습니다. 이 경우 UI에서 아무것도 네트워크 작업이 완료 될 때까지 업데이트되지 않습니다. 그렇다면 서버 IO를 실행하는 스레드를 만들고이를 표시 할 프레임이있는 UI 스레드로 다시 호출하게해야합니다. 링크에 대한

http://developer.android.com/resources/articles/painless-threading.html

+0

감사합니다, 나는이 질문을 게시 한 후 거의 두 번째 이런 생각을 했었 : 여기 그렇다면 도움이 스레딩 및 사용자 인터페이스 상호 작용하는 방법에 대한 몇 가지 일반적인 정보입니다. 이제 "백엔드"는 자체 스레드이며 새 비트 맵을 사용하여 UI를 호출하지만 위에서 언급 한 것과 동일한 문제가 있습니다. 표시되는 유일한 그림이 서버를 닫은 두 번째로 표시됩니다. – christian667

+0

코드를 게시 할 수 있습니까? 업데이트 된 버전? 어쩌면 비트 맵이 렌더링되지 않도록하는 다른 방법이있을 수 있습니다. – mikerowehl

+0

이제 AsyncTask 클래스에 시도해 보았습니다 : public class Backend AsyncTask {.... \t protected void Void doInBackground (Void ... arg0) {그림로드, ui 표시}}} 및 ui : public void setImage (BufferedImage bufImage) {if (bufImage.hasBitmap()) {this.image.setImageBitmap (bufImage.getBitmap());}} – christian667