2017-08-27 81 views
2

我有一个异步调用的问题。 我需要我的“do”循环等待异步调用继续。 但是,当你运行方法“lock.wait()”的应用程序冻结和异步调用不cales。如何正确使用wait和notify方法?

lock.wait(); 

申请冻结,但低于命令行不叫和应用程序不继续执行下面的方法:

callUser.enqueue(new Callback<BaseResponse<User>>() { 
    @Override 
    public void onResponse(Response<BaseResponse<User>> response, Retrofit retrofit) { 
     updateUsersFromServer(response.body()); 
    } 

    @Override 
    public void onFailure(Throwable t) { 
     UserEvent UserEvent = new UserEvent(
       null, 500, R.string.order_unavailable); 
     EventBus.getDefault().post(UserEvent); 
    } 
}); 

我需要更好地了解什么是“等待()”方法像。

如何使应用程序不停在“wait()”方法中?

public void fetchUser(Integer cdCode, String pinckingListNumber) { 
    List<User> Users = new ArrayList<>(); 
    do { 
     fetchUserApi(cdCode, pinckingListNumber); 
     synchronized (lock) { 
      try { 
       lock.wait(); 
      } catch (InterruptedException e) { 
       callUser = false; 
       UserEvent UserEvent = new UserEvent(
         null, 500, R.string.order_unavailable); 
       EventBus.getDefault().post(UserEvent); 
      } 
     } 
     offset = offset + 10; 
     if (!ObjectValidation.isEmptyOrNull(response)) { 
      for (int i = 0; i < response.getRecords().size(); i++) { 
       Users.add(response.getRecords().get(i)); 
      } 
      if (response.getMeta().getRecordCount() < response.getMeta().getOffset()) 
       callUser = false; 
     } else { 
      callUser = false; 
      UserEvent UserEvent = new UserEvent(
        null, 500, R.string.order_unavailable); 
      EventBus.getDefault().post(UserEvent); 
     } 
     try { 
      Thread.sleep(3000); 
     } catch (InterruptedException e) { 
      callUser = false; 
      UserEvent UserEvent = new UserEvent(
        null, 500, R.string.order_unavailable); 
      EventBus.getDefault().post(UserEvent); 
     } 
    } while (callUser); 

    UserEvent UserEvent = new UserEvent(
      Users, 200, R.string.delivery_success); 
    EventBus.getDefault().post(UserEvent); 
} 

private void fetchUserApi(Integer cdCode, String pinckingListNumber) { 
    UserResource UserResource = getRetrofit().create(UserResource.class); 
    Call<BaseResponse<User>> callUser = UserResource.getListUsers(
      authController.getTokenHeader(), 
      pinckingListNumber, 
      cdCode, 
      limit, 
      offset 
    ); 

    callUser.enqueue(new Callback<BaseResponse<User>>() { 
     @Override 
     public void onResponse(Response<BaseResponse<User>> response, Retrofit retrofit) { 
      updateUsersFromServer(response.body()); 
     } 

     @Override 
     public void onFailure(Throwable t) { 
      UserEvent UserEvent = new UserEvent(
        null, 500, R.string.order_unavailable); 
      EventBus.getDefault().post(UserEvent); 
     } 
    }); 
} 

private void updateUsersFromServer(BaseResponse<User> baseResponseUsers) { 
    synchronized (lock) { 
     response = baseResponseUsers; 
     lock.notify(); 
    } 
} 
+2

你究竟在问什么?对于唯一可以辨别的问题的文字回答是“很多人都这样做”。如果你需要帮助,你需要问清楚明确的问题。不是“请帮助我”或“请向我解释”......这两者都不是我们可以回答的问题。 –

+0

如果你不能问清楚/明确的问题,我最好的建议是寻找更多的例子,教程,书籍......并阅读/重读它们,直到你理解为止。或者,找一位准备给你一些关于这个主题的一对一辅导的专家。提示:StackOverflow不是找到这样的人的地方。试试你当地的大学...... –

+0

Soo你为什么要写等待方法? –

回答

-1

在应用程序的情况下,我不能使用Retrofit异步方法。 我不知道是否有一些改进错误,但是当我使用改进的异步方法并执行Wait()命令时,应用程序冻结。

所以我不得不创建改造的同步方法,然后使用一个线程,以便我可以使用等待和通知方法,而不会冻结应用程序。

public void fetchUser(Integer cdCode, String pinckingListNumber) { 
    List<User> Users = new ArrayList<>(); 
     do { 
      fetchUserApi(cdCode, pinckingListNumber); 
      // My code modification 
      synchronized (thread) { 
       try { 
        thread.wait(); 
       } catch (InterruptedException e) { 
        callUser = false; 
        UserEvent UserEvent = new UserEvent(
          null, 500, R.string.order_unavailable); 
        EventBus.getDefault().post(UserEvent); 
       } 
      } 
      offset = offset + 10; 
      if (!ObjectValidation.isEmptyOrNull(response)) { 
       for (int i = 0; i < response.getRecords().size(); i++) { 
        Users.add(response.getRecords().get(i)); 
       } 
       if (response.getMeta().getRecordCount() < response.getMeta().getOffset()) 
        callUser = false; 
      } else { 
       callUser = false; 
       UserEvent UserEvent = new UserEvent(
         null, 500, R.string.order_unavailable); 
       EventBus.getDefault().post(UserEvent); 
      } 
      try { 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { 
       callUser = false; 
       UserEvent UserEvent = new UserEvent(
         null, 500, R.string.order_unavailable); 
       EventBus.getDefault().post(UserEvent); 
      } 
     } while (callUser); 

     UserEvent UserEvent = new UserEvent(
       Users, 200, R.string.delivery_success); 
     EventBus.getDefault().post(UserEvent); 
    } 

    private void fetchUserApi(Integer cdCode, String pinckingListNumber) { 
     UserResource userResource = getRetrofit().create(UserResource.class); 
     final Call<BaseResponse<User>> callUserAPI = userResource.getListUsers(
        authController.getTokenHeader(), 
        pinckingListNumber, 
        cdCode, 
        limit, 
        offset 
      ); 
      // My code modification 
      thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         updateUsersFromServer(callUserAPI.execute().body()); 
         synchronized (thread) { 
          thread.notify(); 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 

      thread.start(); 
    } 
    private void updateUsersFromServer(BaseResponse<User> baseResponseUsers) { 
      response = baseResponseUsers; 
     } 
+0

区别在哪里?错误已经发生了?治疗是什么?单纯的代码不是答案。你必须解释。 – EJP

+0

我编辑了这篇文章的解释。请不要理解,请在下面留下您的评论 – Duk

相关问题