android更新来自外部UI线程的imageview

时间:2013-03-31 13:22:33

标签: java android multithreading tcp android-ui

我正在尝试侦听将图片发送到我的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();

    }

现在的事情是将图像传递给mainactivity中的imageUpdate函数,如果我正在使用runOnUiThread我会因为调用非静态方法而出错。

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

所以我必须在mainactivity启动这个线程并使用在接收位图时从tcpConHandler类发送的imagecheck boolean以某种方式阻止它。

这样做导致应用程序重载内存并且崩溃是有更好的方法来模拟android上的推送内容行为。

无论如何还有一个关于mainactivity的函数运行一个线程,其中的while(true)块可以更新ui并且可以是静态的吗? 。或任何类似的实施。

1 个答案:

答案 0 :(得分:1)

  

如果我正在使用runOnUiThread,则会因调用非静态而出错   方法

因为您需要向MainActivity发送tcpConHandler上下文,以便从非活动类访问runOnUiThread,而不是以静态方式调用runOnUiThread

创建一个tcpConHandler构造函数,用于将Activity上下文传递为:

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