Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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 如何等待异步任务返回_Java_Android - Fatal编程技术网

Java 如何等待异步任务返回

Java 如何等待异步任务返回,java,android,Java,Android,所以我有一个问题,我想知道如何解决它,如果它可以解决的话 我有一个名为Messenger的外部库类,它定义了sendMessage(String msg)方法。我还有下面的Messenger Manager类 public class MessengerManager{ private Messenger messenger; public MessengerManager(Context context){ messenger = new Messenge

所以我有一个问题,我想知道如何解决它,如果它可以解决的话

我有一个名为Messenger的外部库类,它定义了sendMessage(String msg)方法。我还有下面的Messenger Manager类

public class MessengerManager{

    private Messenger messenger;

    public MessengerManager(Context context){
         messenger = new Messenger(context);
    }

    public void message(){
         String msg = "12435";
         messenger.sendMessage(msg);
         // Do more stuff
         .....
         .....
         .....
    }         
} 
所以问题是sendMessage异步运行并启动一个新的活动。可能使用startActivity()(我们将此活动称为A)。因此,sendMessage之后的代码(“DoMoreTuff”)会立即运行。但是,我需要等待新创建的活动(活动A)返回以继续“做更多的事情”

由于sendMessage是在外部库中定义的方法,因此我无法以任何方式对其进行更改,也无法访问其源代码


所以,简而言之,我的问题是sendMessage创建了一个新线程(可能使用startActivity()),我需要知道这个新创建的活动何时结束。但是,我无法监视它,因为它是在外部库中定义的。有人知道如何解决这个问题吗?

异步任务应该是您需要的。 让您的消息()启动一个异步任务,在doInBackground()中调用messenger.sendMessage(msg)。如果您关心AsyncTask的结果,请在onPostExecute()中获取它


一个公认的难堪的方法就是打电话 Thread.sleep(整数毫秒) 在sendMessage()之后,在继续执行其余代码之前。当然,只有当您能够相当准确地估计获得回调所需的时间时,这才有帮助

更好的选择正如凯飞所说。但你不会想要“做更多的事情”就在现在。相反,将其放入一个新方法中,并在onPostExecute()中调用该方法。这样,在AsyncTask返回之前,代码不会继续

编辑:看到您添加的关于需要完成创建的活动的内容。如果是这样的话,您将需要以某种方式与该活动进行通信(如果没有看到所有代码,我就无法与该活动进行通信)。但如果你有,那么在“做更多的事情”之前,插入

在该活动中,在完成时将finished变量设置为true(无论您如何定义done)。因此,主线程将运行此循环,直到第二个线程上的活动完成,然后第一个线程将继续


双重编辑:另一个想法。假设用户必须完成的其他活动是某种形式的。在主活动中,在调用sendMessage()之后,会出现一些弹出窗口,用户在完成新活动后选择“已完成”。只有在选择“完成”后,程序才能继续。这对用户来说有点烦人,但是如果只是一次额外的点击,那应该可以工作。

正如您所提到的,
sendMessage()
异步运行。如果编写正确,它还必须提供回调接口,消息传递完成后将调用其方法。移动回调方法中的代码。

异步任务是否会阻止主UI线程,直到它返回?因为我不希望在sendMessage()返回之前执行“DoMore stuff”代码。不,AsyncTask在与主UI线程不同的线程中运行。AsyncTask将启动一个新线程并立即返回。新线程执行messenger.sendMessage(msg)工作。这取决于您如何使用它。
doInBackground()
中的任何内容都将在单独的线程上运行。
AsyncTask
的所有其他方法都在主服务器上运行thread@codeMagic对谢谢你的澄清。只有doInBackground()在另一个线程中运行。如果AsyncTask在单独的线程中运行,那么主UI线程中的执行不会继续执行“Do more stuff”代码吗?此外,sendMessage()方法需要访问UI线程(它会弹出一个用户需要响应的对话框)。这对AsyncTask有效吗?我不确定为什么不行,但我对AsyncTask没有太多的经验,所以我不能肯定。我想说试试看会发生什么?因为它是一个第三方库,我甚至无法查看sendMessage的实现或活动,更不用说在其中引入任何新代码了。本质上,sendMessage()是一个黑盒。我所知道的是,它创建了一个我需要等待完成的活动。@nave,它似乎……不可能四处走动。所以我想我得到的唯一的建议是我的第一个建议,使用一些睡眠或等待方法。谢谢你的建议,但是新创建的活动等待用户输入完成。所以我必须以一种真实的方式来估计这可能需要多长时间。因此,睡眠选项在我看来也不起作用。我尝试过AsyncTask建议,但它不起作用。我的doInBackground()中有sendMessage。问题是sendMessage()创建一个活动并返回(可能调用startActivity()。现在我需要等待这个新创建的活动完成。但是,由于sendMessage()返回,AsyncTask将继续执行postExecute()。不幸的是,它的编写似乎不太正确。文档中没有提到回调。
while(!activity.isFinished()) {}