我正在尝试侦听将图片发送到我的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并且可以是静态的吗? 。或任何类似的实施。
答案 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);