2011-04-25 175 views
3

Java新手在这里。我正在使用第三方库,它给了我一个函数,比如说F(),它的输出决定了我的逻辑。所以我需要在我的代码中进一步处理它的结果。等待线程完成执行

问题是F()做了一些I/O,因此产生了一个线程来完成这个功能。他们给了我几个回调来实现哪些被调用来从线程返回状态/值。这很好,除了函数F()立即返回并且我的代码的其余部分继续运行。我不希望这样,因为我必须根据F()的结果分配一些对象,所以我真的想等F()真正完成。

这应该是人们经常碰到的问题。处理这个问题的正确方法是什么?这是我的设计或第三方库中的问题吗?或者我不是很了解图书馆?

为了完整起见,我正在开发一个android应用程序,该库是facebook sdk。该函数是单点登录函数authorize()。虽然这是一个足够普遍的问题,我认为最好在Java论坛中解决。

感谢您的任何帮助。 - P

回答

3

想想这个:
一个Android应用程序的主线程是管理线程用户界面,所以如果你想等到f()方法结束,屏幕将会冻结。你可能会认为一个好的解决方案是产生一个新的线程,并调用其中的方法f(),并使用可调用或未来来等待f()。错误。线程创建下面的代码将会执行,所以你将会遇到同样的问题。
那么你如何解决这个问题?简单。重新设计您的应用程序并使用监听器,a.k.a.回调。

编辑:侦听器或回调只是一个方法(或多个方法),类A实现并将此实现传递给类B以执行它。 B类不知道他在执行什么,他只是执行一个方法。

例子:

public class A{ 
    public A(){ 
     B b = new B (new B.Listener(){ 
      @Override 
      void onResult (String result){ 
       //result is "Core dumped!" 
      } 
     }); 
     b.aMethod(); 
    } 
} 

public class B{ 
    private final Listener listener; 

    public static interface Listener{ 
     void onResult (String result); 
    } 

    public B (Listener listener){ 
     if (listener == null) throw new IllegalArgumentException ("The \"listener\" parameter cannot be null."); 
     this.listener = listener; 
    } 

    public void aMethod(){ 
     //Do something interesant 
     //... 
     String error = "Core dumped!" 

     //Call the listener 
     listener.onResult (error); 
    } 
} 

在你的情况,你将有一些与此类似:

public class YourClass{ 
    public void aMethod(){ 
     FaceBookClass fb = new FaceBookClass(); 
     fb.setListenerToF (new FaceBookClass.FListener(){ 
      @Override 
      void theCallback (Result aResult){ 
       //Do something with result 
      } 
     }); 
     fb.f(); 

    } 
} 

public class FaceBookClass{ 
    public static interface FListener{ 
     void theCallback (Result aResult); 
    } 

    public void f(){ 
     ... 
    } 

    public void setListenerToF (FListener listener){ 
     ... 
    } 
} 
+0

正是我的问题!你明白了! FB sdk提供了一个wait()方法,但是如果我在主线程中调用它,它不会解决问题,因为它只会冻结屏幕。这个回调是什么?我将不得不检查。你能提供一个链接吗?问题是我的视图是根据登录操作的结果绘制的。 – user220201 2011-04-25 14:59:33

+0

看看我的答案。 – 2011-04-25 15:17:55

+0

感谢您的回答。在这种情况下,b.aMethod()的行为是什么?它会等待回调吗?由于aMethod()本质上是创建一个线程并在该线程中执行有趣的部分。在我的情况下,funct F()采用DialogListener而不是构造函数。所以我通过它,但F()立即返回,并在一个点后调用回调。但在继续执行其他逻辑之前,确实想等待回调被调用。 – user220201 2011-04-25 16:08:46