Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确使用wait和notify方法?_Java_Android_Asynchronous_Async Await_Threadpool - Fatal编程技术网

Java 如何正确使用wait和notify方法?

Java 如何正确使用wait和notify方法?,java,android,asynchronous,async-await,threadpool,Java,Android,Asynchronous,Async Await,Threadpool,我对异步调用有问题。 我需要我的“do”循环来等待异步调用继续。 但是,当您运行方法“lock.wait()”时,应用程序冻结且异步调用不是cales lock.wait(); 应用程序已冻结,但未调用下面的命令行,且应用程序未继续执行下面的方法: callUser.enqueue(new Callback<BaseResponse<User>>() { @Override public void onResponse(Response<BaseR

我对异步调用有问题。 我需要我的“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);
    }
});
callUser.enqueue(新回调(){ @凌驾 公共响应(响应、改装){ updateUsersFromServer(response.body()); } @凌驾 失效时的公共无效(可丢弃的t){ UserEvent UserEvent=新的UserEvent( null,500,R.string。订单不可用); EventBus.getDefault().post(UserEvent); } }); 我需要更好地理解“wait()”方法是什么样的

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

public void fetchUser(整数cdCode,字符串pinkinglistnumber){
列表用户=新建ArrayList();
做{
fetchUserApi(cdCode,pinckingListNumber);
已同步(锁定){
试一试{
lock.wait();
}捕捉(中断异常e){
callUser=false;
UserEvent UserEvent=新的UserEvent(
null,500,R.string。订单不可用);
EventBus.getDefault().post(UserEvent);
}
}
偏移量=偏移量+10;
如果(!ObjectValidation.isEmptyOrNull(响应)){
for(int i=0;i
对于应用程序,我不能使用改造异步方法。 我不知道是否存在一些改装错误,但当我使用改装异步方法并执行Wait()命令时,应用程序冻结了

所以我必须创建改造的同步方法,然后使用线程,这样我就可以使用wait和notify方法,而不会冻结应用程序

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;
        }
public void fetchUser(整数cdCode,字符串pinkinglistnumber){
列表用户=新建ArrayList();
做{
fetchUserApi(cdCode,pinckingListNumber);
//我的代码修改
已同步(线程){
试一试{
thread.wait();
}捕捉(中断异常e){
callUser=false;
UserEvent UserEvent=新的UserEvent(
null,500,R.string。订单不可用);
EventBus.getDefault().post(UserEvent);
}
}
偏移量=偏移量+10;
如果(!ObjectValidation.isEmptyOrNull(响应)){
for(int i=0;ipublic 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;
        }