排球与Gson同步请求

时间:2016-05-17 12:20:09

标签: android request synchronization android-volley

我有一个使用Gson的截击请求,但我想填充一个带有截击响应的微调器。但这是同步。

EstadoRequestHelper.statesRequest(Request.Method.GET, EndpointURL.GET_ESTADO, null, new Response.Listener<Estado[]>() {
        @Override
        public void onResponse(Estado[] response) {
            ArrayList<Estado> estadoArrayList = new ArrayList<>();

            Estado estado = new Estado();
            estado.setId(0);
            estado.setDescricao("Selecione um estado");

            estadoArrayList.add(estado);
            estadoArrayList.addAll(Arrays.asList(response));

            estadoAdapter = new EstadoAdapter(getActivity(), R.layout.simple_spinner_dropdown_item, estadoArrayList);
            spn_estado.setAdapter(estadoAdapter);

            //If i get the spn_estado selection here, 
            //it works, but i dont want to get it here...

            progressDialogEstado.dismiss();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            progressDialogEstado.dismiss();
            Toast.makeText(getActivity(), "ERRO ESTADO", Toast.LENGTH_LONG).show();
        }
    });

如果我将spn_estado填充到请求中,它就会......但我不想将其填充到请求中...

private void veferyUser() {
    usuario = UsuarioSingleton.getInstance().getUsuario();

    if (usuario == null) {
        et_telefone.setVisibility(View.GONE);
        et_celular.setVisibility(View.GONE);
        et_logradouro.setVisibility(View.GONE);
        et_numero.setVisibility(View.GONE);
        et_complemento.setVisibility(View.GONE);
        et_bairro.setVisibility(View.GONE);
        spn_cidade.setVisibility(View.GONE);
        spn_estado.setVisibility(View.GONE);
    } else {
        et_nome.setText(usuario.getNome() != null ? usuario.getNome() : "");
        et_cpf.setText(usuario.getCpf() != null ? usuario.getCpf() : "");
        et_email.setText(usuario.getEmail() != null ? usuario.getEmail() : "");
        et_telefone.setText(usuario.getTelefone() != null ? usuario.getTelefone() : "");
        et_celular.setText(usuario.getCelular() != null ? usuario.getCelular() : "");

        progressDialogEstado = Util.ProgressDialog(getActivity(), "Carregando Estados", getString(R.string.prompt_aguarde));
        requestEstados();

        if (usuario.getEndereco() != null) {
            et_logradouro.setText(usuario.getEndereco().getLogradouro() != null ? usuario.getEndereco().getComplemento() : "");
            et_numero.setText(String.valueOf(usuario.getEndereco().getNumero()));
            et_complemento.setText(usuario.getEndereco().getComplemento() != null ? usuario.getEndereco().getComplemento() : "");
            et_bairro.setText(usuario.getEndereco().getBairro() != null ? usuario.getEndereco().getBairro() : "");

            if (usuario.getEndereco().getCidade() != null) {
                spn_cidade.setSelection(usuario.getEndereco().getCidade().getId(), false);
                if (usuario.getEndereco().getCidade().getEstado() != null) {
                 //I want to populate it here.
                 spn_estado.setSelection(usuario.getEndereco().getCidade().getEstado().getId(), false);
                }
            }
        }

        btn_registrar.setText(R.string.action_edit);
    }
}

1 个答案:

答案 0 :(得分:1)

使用RequestFuture:

    RequestFuture<Estado[]> future = RequestFuture.newFuture(); 
EstadoRequestHelper.statesRequest(Request.Method.GET, EndpointURL.GET_ESTADO, null, future, future);

将请求添加到队列后,执行:

    try {
        Estado[] response = future.get();
ArrayList<Estado> estadoArrayList = new ArrayList<>();

                Estado estado = new Estado();
                estado.setId(0);
                estado.setDescricao("Selecione um estado");

                estadoArrayList.add(estado);
                estadoArrayList.addAll(Arrays.asList(response));

                estadoAdapter = new EstadoAdapter(getActivity(), R.layout.simple_spinner_dropdown_item, estadoArrayList);
                spn_estado.setAdapter(estadoAdapter);

                //If i get the spn_estado selection here, 
                //it works, but i dont want to get it here...

                progressDialogEstado.dismiss();

      } catch (InterruptedException e) {
        // handle the interrupted error
      } catch (ExecutionException e) {
        progressDialogEstado.dismiss();
                Toast.makeText(getActivity(), "ERRO ESTADO", Toast.LENGTH_LONG).show();
      }

这是一个阻止呼叫,将在收到呼叫或错误后返回

请注意,虽然这可以回答您的问题,但更好的方法是确保代码的其他部分(例如,检查适配器)可以处理异步行为。