【问题标题】:Waiting for thread to finish without blocking UI thread等待线程完成而不阻塞 UI 线程
【发布时间】:2011-04-25 13:59:20
【问题描述】:

我在方法中运行一个线程,我想在线程完成后返回一个值,这是我尝试执行 join() 但阻塞 UI 线程的问题。 我怎么能等待线程完成然后返回值而不阻塞 UI 线程?

Boolean foo(){

myThread mt = new myThread();
mt.start();     
return mt.isSentSuccessfully;

}

【问题讨论】:

  • 提供一些代码可能会有所帮助。
  • 有什么原因你不能转这一轮并在完成时让后台线程向 UI 发出信号? (这将是正常的做事方式,从而避免轮询。)
  • 您能否解释更多或提供如何完成此操作的代码 sn-p。谢谢
  • 您的示例表明您不需要线程来完成这项工作。如果您正在等待线程完成,则根本没有理由产生新线程。实际上,它会减慢整个过程。

标签: java android multithreading


【解决方案1】:

您可以为此使用 Android 的 AsyncTaskhttp://developer.android.com/reference/android/os/AsyncTask.html 当我使用它时,我将后台任务放在扩展AsyncTask 的类中,并覆盖onPreExecute()onPostExecute(..) 方法以显示/隐藏ProgressDialog。效果很好。

【讨论】:

  • 我已经看过了,但我不认为它最适合我想要做的事情,我怎么能等待它完成然后在调用方法中返回值?
  • 我不知道这是否可能。您说您不想阻塞 UI,但您希望调用方法(可能来自当前 Activity)调用一个长时间运行的方法并等待它返回。您可以让长时间运行的线程在完成其工作时调用 Activity。
  • @Fevos:如果您在其他线程完成之前不阻塞,您可以从方法返回什么值?做到这一点的唯一方法是根本不在 UI 线程中调用您的方法,将工作卸载到后台线程......这正是 AsyncTask 所做的。
  • @Fevos:你想要的东西是不可能的和不必要的。
  • 我会告诉你为什么它是必要的,我需要其他开发人员使用我的类并能够调用方法并获得响应,如果不可能,那么我可以寻找其他解决方案,但我不觉得没必要!
【解决方案2】:

如果你真的不想使用 AsyncTask,那么你可能想定义一个Handler

然后,当后台作业完成时,在您的后台线程中向主线程发送一条消息,如下所示:

ActivityMainThreadClassName.this.myUpdateHandler.sendMessage(m);

其中 myUpdateHandler 是您创建的处理程序。

【讨论】:

    【解决方案3】:

    你试过投票Thread.getState()吗?

    类似这样的:

    android.os.Handler h = new Handler();
    h.postDelayed(new Runnable() { 
    public void run () {
          if (thread.getState() == Thread.State.TERMINATED) {
               // your code here
               return;
          }
          h.postDelayed(this, 1000);
    }, 1000);
    

    此示例应该每秒轮询一次线程状态...(我没有测试过

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多