gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:07:35 25 4
gpt4 key购买 nike

每当按下按钮和释放按钮时,我都会发送一个HTTP Post。在释放按钮之前,“按下”的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;
}
});

最佳答案

从概念上讲,您的HTTPAsyncTask doInBackground()包含2个不同的操作:

  • 连接,并将请求排队到套接字
  • 收到回复

  • (当然,此后将调用 onPostExecute()。)

    如前所述,您需要控制 Action #1在两个不同线程上的执行顺序,同时允许 Action #2并行发生。

    使用通用的 AsyncTask机制是不可能的,因为您没有提供任何“将任务一分为二”的方法。当线程B从 Action #1切换到 Action #2,反之亦然时,线程A无法确定。

    可能可以添加这样的逻辑,但是您尚未说明如何进行套接字调用。

    但是,提供额外的细节毫无意义。与网络请求关联的极端情况会破坏您可能拥有的订单保证。网络是有损耗的;请求可能失败,响应可能失败。即使请求是按顺序发送的,请求也可能会无序到达(特别是如果您使用两个单独的套接字)。自动重试可能需要几秒钟才能完成。

    IOW,“被按下”的请求可能会被网络丢失,并且您可能必须在“未按下”请求完成后的某个时间将其重新排队到套接字。

    我建议您放弃要寻找的“部分条件并发”,只需在执行第二个 HTTPAsyncTask之前先完成它即可。

    另外,您可以在每个POST中添加一个顺序的“请求ID”,或在第二个请求中包含有关第一个请求的信息,以便服务器能够对已发生的事情进行分类,即使请求是乱序到达的也是如此。

    关于java - Android中两个并发的AsyncTasks-如何处理竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60217012/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com