如何正确使用 wait 和 notify 方法?
How to use the wait and notify methods correctly?
我的异步调用有问题。
我需要 "do" 循环来等待异步调用继续。
但是当你 运行 方法 "lock.wait ()" 应用程序冻结并且异步调用不是 cales.
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 ()" 方法是什么样的。
如何让应用程序在"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();
}
}
在应用程序的情况下我不能使用Retrofit 异步方法。
不知道是不是retrofit的bug,但是当我使用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;
}
我的异步调用有问题。 我需要 "do" 循环来等待异步调用继续。 但是当你 运行 方法 "lock.wait ()" 应用程序冻结并且异步调用不是 cales.
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 ()" 方法是什么样的。
如何让应用程序在"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();
}
}
在应用程序的情况下我不能使用Retrofit 异步方法。 不知道是不是retrofit的bug,但是当我使用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;
}