0

ソケットを介して(sendfileを使用するCプログラムから)受信したAndroidアプリで2つの連続した画像を表示しようとしています。送信者コードは正常に動作しているようですが、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 アプリによって受信された最初の画像が正しく表示された後、次に受信された (正しく受信された) 画像が表示されず、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);
               }
            }
         }
    }
 }
4

1 に答える 1

0

あなたが抱えている問題は、データを受信した後に適切な画像にデコードすることにあるようです。

Drawable.createFromStream()を使用せず、代わりに使用するか、最初BitmapFactory.decodeStream()にデータを手動でダウンロードして使用することをお勧めします。データの受信時に前者がデコーダーに十分に追いつかない場合、後者が役立つ場合があります。byte[]BitmapFactory.decodeByteArray()

現在使用しているメソッドは、実際には を呼び出すことBitmapFactory.descodeResourceStream()になります。これは、リモート ソケットからではなく、ローカルの res/ パッケージから画像データを読み取るために使用されます。

于 2012-12-01T04:33:28.513 に答える