如何等待异步任务返回

时间:2014-07-10 03:12:24

标签: java android

所以我有一个问题,我想知道如果可以解决它怎么解决它。

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

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()(让我们调用这个Activity A)。因此,sendMessage(“Do more stuff”)之后的代码立即运行。但是,我需要等待新创建的活动(活动A)返回以继续“执行更多内容”。

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

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

3 个答案:

答案 0 :(得分:4)

AsyncTask应该是你想要的。 让你的 message()启动一个AsyncTask,它在 doInBackground()中调用 messenger.sendMessage(msg)。如果您关心AsyncTask的结果,请在 onPostExecute()中获取它。

http://developer.android.com/reference/android/os/AsyncTask.html

答案 1 :(得分:2)

一个公认的丑陋方式是打电话 Thread.sleep(int毫秒) 在sendMessage()之后,在继续使用其余代码之前。当然,只有你能够相当准确地估计获得回调需要多长时间,这才会有所帮助。

更好的选择是凯菲说的。但你不会想要做更多的东西"它现在在哪里。相反,将它放在一个新方法中,并在onPostExecute()中调用该方法。这样,代码将不会继续,直到AsyncTask返回。

编辑:看到您需要创建的活动完成的补充。如果是这种情况,那么您将以某种方式需要与该活动进行通信(我无法在不查看所有代码的情况下与之交谈)。但如果你有这个,那么在"做更多的东西"之前,插入

while(!activity.isFinished()) {}

并且在该活动中,让它在完成后将完成变量设置为true(但是您定义完成)。所以主线程将运行此循环,直到第二个线程上的活动完成,然后第一个线程将继续。

Double Edit:另一个想法。让我们说用户必须完成的其他活动是某种形式。在你的主要活动中,在你调用sendMessage()之后,有一些弹出窗口,用户选择"完成"当他们完成新活动时。只有完成后才能继续执行该程序"已被选中。对用户来说有点烦人,但如果它只有一个额外的点击,那应该有效。

答案 2 :(得分:0)

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

相关问题