我正在编写这个应用程序,我从tcp连接获取实时图像,我需要在ImageViev上显示它们。
我正在做的是在按钮点击内调用asynctask。但它似乎创造了许多后台线程。
这是按钮点击事件的代码
btnLive.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try
{
String name = ((Button)v).getText().toString();
if(name.equalsIgnoreCase("Live"))
{
DataOutputStream dos;
DataInputStream dis;
String reply;
if(config.conn.isConnected())
{
dos = new DataOutputStream(config.conn.getOutputStream());
dos.writeBytes("STREAM-LIVE-IMAGES");
dos.flush();
//dis = new DataInputStream(in);
in = config.conn.getInputStream();
while (true)
{
new myTask().execute(in);
}
}
}
}
catch(Exception ex)
{
Log.d("Live Button ", "Exception " + ex.getMessage() );
}
}
});
这是asyncTask的代码
class myTask extends AsyncTask<InputStream, Integer, Bitmap> {
protected Bitmap doInBackground(InputStream...in)
{
Bitmap bmp = null;
try
{
//Do some none UI stuff here and return a value *result
byte[] rcvPacket = ReadJpegBinaryAndRemoveDelimiter(in[0]);
bmp = BitmapFactory.decodeByteArray(rcvPacket, 0, rcvPacket.length);
Log.d("Live Image Streaming ", "Recieved Images: " + rcvPacket.length + " " + bmp);
} catch (Exception e) {
e.printStackTrace();
}
return bmp;
}
答案 0 :(得分:4)
while (true) {
new myTask().execute(in);
}
因为你在循环中执行AsyncTask
,在无限循环的情况下,听起来不太好,你需要改变它。
您需要在循环外部执行。你不应该,不这样做。
致电
new myTask().execute(in);
没有循环。
答案 1 :(得分:0)
我设法用后台线程对它进行排序,因为asynctask不适合我的问题。
所以我创建了一个单独的后台线程,并在imageview上使用了一个post runnable方法来更新UI。