如何在按钮点击事件中调用异步任务

5
我将为您提供翻译。此应用程序需要从TCP连接获取实时图像,并需在ImageView上显示。我正在调用异步任务来处理按钮点击事件,但似乎会创建多个后台线程。以下是按钮点击事件的代码。
    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;
}

你不能随意执行太多的AsyncTasks,因为有一个限制。 - ania
我想在这里实现一个上传服务会更好。运行此服务并将您的位图传递给它。 - Yury
2个回答

4
while (true) {                               
 new myTask().execute(in);
}

由于你正在循环中执行AsyncTask,在你的情况下是一个无限循环,这听起来并不好,你需要进行更改。

你需要在循环之外执行execute。你不应该、也必须不要这样做。

只要调用即可。

new myTask().execute(in);

不使用循环。


1
不要在循环中执行它。每次点击按钮时,只需执行异步任务并让它完成其工作。 - Simon Dorociak
你应该在doInBackground方法中执行此操作。只需执行一次AsyncTask并在doInBackground中获取所有图像。 - Simon Dorociak
如果你看过我的代码,我是在doInBackground方法中执行它。 - Mr.Noob
当您首次将所有图像传递到某个List<InputStream>并将其传递给AsyncTask时,在doInBackground中创建循环,这种情况怎么样? - Simon Dorociak
那你为什么不在doInBackground里面做呢?当你点击按钮时,只需执行任务并在doInBackground中完成所有需要做的工作,同时从连接获取InputStream。 - Simon Dorociak
显示剩余3条评论

0

我通过后台线程解决了这个问题,因为asynctask不适合我的问题。

所以我创建了一个单独的后台线程,并在imageview上使用post runnable方法来更新UI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接