2

Android に画像を送信し、この画像を画像ビューに設定する接続をリッスンしようとしています。

このプロセスは、プッシュ コンテンツの動作をシミュレートするために自動的に実行する必要があります。

このコードは TCPConHandler クラスにあります

public void listenForIncomingImageFlag() {
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    FlagScan = new Scanner(mySocket.getInputStream());
                    while (true) {
                        Flag = FlagScan.nextInt();
                        Log.d("FLagImage", "Flag ="+Flag);
                        if (Flag == 1) {
                            listenForIncomingImage(true);
                            Flag = 0;
                        }

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

            }
        }).start();

    }

TCP 接続を実行しているスレッドがソケットを返すとすぐに、この関数が呼び出されます。次に、listenForIncomingImage という別の関数を開始します。

public void listenForIncomingImage(boolean b) {
        check = b;
        Thread InComImage = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    inComImageBitmap = BitmapFactory.decodeStream(mySocket
                            .getInputStream());
                    MainActivity.setImage(inComImageBitmap, true);
                    check = false;
                    Log.d("Bitmap", "Bitmap receviced and sent to method");
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });
        InComImage.start();

    }

runOnUiThread を使用している場合、mainactivity の imageUpdate 関数に画像を渡すようになりました。非静的メソッドを呼び出すとエラーが発生します。

public void imageUpdate() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    runOnUiThread(new Runnable() {
                        public void run() {
                            while(imageCheck == true){
                            myImage.setImageBitmap(finalImage);
                            imageCheck = false;}

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

そのため、メインアクティビティのときにこのスレッドを開始し、ビットマップを受信したときに tcpConHandler クラスから送信される imagecheck ブール値を使用して何らかの方法でブロックする必要がありました。

そのようなことを行うと、アプリがメモリを過負荷にしてクラッシュし、 Android でコンテンツのプッシュ動作をシミュレートするより良い方法があります。

また、UIを更新して静的にすることができるwhile(true)ブロックを内部に持つスレッドを実行するmainactivityに関数を持たせる方法はありますか?. または同様の実装。

4

1 に答える 1

1

runOnUiThread を使用している場合、非静的メソッドの呼び出しでエラーが発生します

静的な方法で呼び出すのではなく、非アクティビティ クラスからアクセスするためにMainActivityコンテキストを送信する必要があるためです。tcpConHandlerrunOnUiThreadrunOnUiThread

tcpConHandlerActivity コンテキストを次のように渡すためのコンストラクターを作成します。

public class TcpConHandler{
Activity activity;

public TcpConHandler(Activity activity){
 this.activity=activity;
}
//...your code here..
public void imageUpdate() {
//...your code here...
     activity.runOnUiThread(new Runnable() {
       public void run() {
              // update imageView here...
          }
      });
}

MainActivity から、アクティビティ インスタンスを送信して TcpConHandler オブジェクトを作成します。

TcpConHandler tchConhandler=new TcpConHandler(this);
于 2013-03-31T13:44:27.143 に答える