【问题标题】:How to access result of void onComplete() of a Task如何访问任务的 void onComplete() 的结果
【发布时间】:2018-05-18 17:30:41
【问题描述】:

我正在使用一个设计奇怪的库,这段代码基本上有一个Task 对象和onComplete()onfail() 方法,这两个方法都是无效的,所以我不能在它们里面使用return。

我尝试使用在任务onComplete()onfail()using 中更新的外部变量

mytask.wait();
return value; 

打算等待任务完成然后返回值,但我得到了

java.lang.IllegalMonitorStateException: object not locked by thread before wait()

如果我尝试类似的东西

while(!mytask.isComplete(){}

强制方法等待完成

应用程序完全冻结

如何正确获取任务完成时的值?

【问题讨论】:

    标签: java android multithreading android-task


    【解决方案1】:

    java.lang.IllegalMonitorStateException: 在 wait() 之前对象没有被线程锁定

    您很接近,但您缺少一些同步。要执行wait()notify(),您需要在synchronized 块中。

    如果您想编写一个返回某个值的任务,我会执行以下操作。将结果存储在一个字段中,在 synchronized onComplete()onFail() 方法中更新该字段。然后你的调用线程可以在完成后使用waitForResult() 方法返回它。

    public class MyTask implements Task {
        private String result;
        public synchronized void onComplete() {
            result = "it worked";
            // this is allowed because the method is synchronized
            notify();
        }
        public synchronized void onFail() {
            result = "it failed";
            // this is allowed because the method is synchronized
            notify();
        }
        public synchronized String waitForResult() {
            // a while loop is a good pattern because of spurious wakeups
            // also, it's important to realize that the job might have already
            // finished so we should always test it _before_ we wait
            while (result == null) {
                wait();
            }
            return result;
        }
    }
    

    测试一切是否完成的线程只需要做:

    String result = myTask.waitForResult();
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您可以创建一个interface,将其传递给AsyncTask(在构造函数中),然后调用onPostExecute()中的方法

      例如:

      你的界面:

      public interface OnTaskCompleted{
          void onTaskCompleted();
      }
      

      您的活动:

      public class YourActivity implements OnTaskCompleted{
          // your Activity
      }
      

      还有你的 AsyncTask:

      public class YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type
          private OnTaskCompleted listener;
      
          public YourTask(OnTaskCompleted listener){
              this.listener=listener;
          }
      
          // required methods
      
          protected void onPostExecute(Object o){
              // your stuff
              listener.onTaskCompleted();
          }
      }
      

      【讨论】:

      • 问题是我需要在一个方法中得到这个任务的结果。 Task 不是 AsynTask 而是 Task 对象,并且内部已经有 onComplete() 方法问题是如何在完成时访问值并返回它,因为 onComplete 是无效的并且不能从它返回值
      • 你能显示你的完整代码,这样我就可以理解你的问题了。
      • 这就像包 com.google.android.gms.tasks 的自定义任务我的问题是如何在 onSuccess 外部返回结果,因为它是一个 void 内部类,我不能在它内部和外部使用 return除非我找到在返回之前等待任务完成的方法,否则我可以获得未完成状态。
      • while 循环不是最好的做法。
      • while 循环不是最好的做法。
      猜你喜欢
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 2020-01-26
      • 2019-10-07
      • 2011-08-11
      • 2020-06-06
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多