Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何执行后台任务以命中多个API-AndroidX_Java_Android_Multithreading_Api - Fatal编程技术网

Java 如何执行后台任务以命中多个API-AndroidX

Java 如何执行后台任务以命中多个API-AndroidX,java,android,multithreading,api,Java,Android,Multithreading,Api,我想点击多个API以从服务器获取一些数据,但当我试图同时点击多个API时,它有可能会相互中断,因此有时其中一个API不起作用,有解决方案吗 我将其设置为OnCreate方法 //API1 mainActivity_.rncryptorLoadGameRating(mGameID); //API2 mainActivity_.rncryptorLoadGameRatingComment(mGameID, 0); 我首先要做一些假设,因为问题的定义不是很清楚 我不确定两个不同的连续API调用如何相

我想点击多个API以从服务器获取一些数据,但当我试图同时点击多个API时,它有可能会相互中断,因此有时其中一个API不起作用,有解决方案吗

我将其设置为OnCreate方法

//API1
mainActivity_.rncryptorLoadGameRating(mGameID);
//API2
mainActivity_.rncryptorLoadGameRatingComment(mGameID, 0);

我首先要做一些假设,因为问题的定义不是很清楚

我不确定两个不同的连续API调用如何相互作用和干扰。很可能同一实例中的两个调用处于某种竞争状态。这意味着你的代码中有东西被破坏了。就架构而言,两个不同的API调用决不能相互中断

如果两个方法/API的并发调用可能会相互中断,一种简单的方法是使用java中的synchronized和GuardedBy(“this”)将方法rncryptorLoadGameRating(mGameID)和rncryptorLoadGameRatingComment(mGameID,0)用相同的内在锁锁定,两个方法不会并行调用,而是按顺序调用。只有一个API调用可以拥有锁并修改对象的状态并释放锁,以便其他API可以拥有锁并使用对象状态。据我所知,两个方法的并行调用在mainActivity的对象状态下处于竞争状态,这就是它们相互中断的原因

public class MainActivity {

    @GuardedBy("this") int yourStateVariable;

    synchronized void rncryptorLoadGameRating(int mGameID){
        //Definition of method
    }

    synchronized void rncryptorLoadGameRatingComment(int mGameID, int number){

    }
}
您需要使用锁来保护状态变量。此外,将您的状态封装在api方法的对象中。就性能而言,这不是一个好方法,但效果很好。您可能还想看看以下内容:互斥、信号量或锁存、Java中的未来承诺。我也可以在这里为他们写例子。然而,这将是太多了。还请检查线程限制和堆栈限制以获得更好的性能


如果是Kotlin代码,我建议签入协同程序

如果您熟悉
RXJava
,可以使用Zip操作符来完成此操作。。请看。在您的状态变量中,这个@guardby(“this”)是什么;这是可选的。其实没必要。其目的是使用对象持有的同一个锁来锁定状态变量。