Android中两个并发的AsyncTasks-如何处理竞争条件?

问题描述 投票:1回答:1

每当按下按钮并释放按钮时,我都会发送HTTP帖子。在释放按钮之前,“按下”的POST可能没有响应,因此我尝试同时运行这些任务。但是,有时,释放按钮的POST请求在请求按下按钮之前被发送到服务器。如何避免/解决此问题?

button = (ImageButton) findViewById((R.id.button1));
        button.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                HTTPAsyncTask task = new HTTPAsyncTask();
                if (event.getAction() == MotionEvent.ACTION_DOWN ) {
                    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Utilities.StringCollection.rotateRight);
                    return true;
                }
                else if (event.getAction() == MotionEvent.ACTION_UP){
                    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Utilities.StringCollection.stop);
                    return true;
                }
                return false;
            }
        });
java android multithreading android-asynctask thread-safety
1个回答
0
投票

如果您的最小SDK为11“ HONEYCOMB”,则可以像这样调用asyncTask使其在单线程中运行,以防止它们之间出现竞争状态:

button = (ImageButton) findViewById((R.id.button1));
        button.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                HTTPAsyncTask task = new HTTPAsyncTask();
                if (event.getAction() == MotionEvent.ACTION_DOWN ) {
                    task.execute(Utilities.StringCollection.rotateRight);// using one thread
                    return true;
                }
                else if (event.getAction() == MotionEvent.ACTION_UP){
                    task.execute(Utilities.StringCollection.stop);// using one thread
                    return true;
                }
                return false;
            }
        });
© www.soinside.com 2019 - 2024. All rights reserved.