【问题标题】:Volley With Gson Sync Request带有 Gson 同步请求的 Volley
【发布时间】:2016-05-17 12:20:09
【问题描述】:

我有一个使用 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);
    }
}

【问题讨论】:

  • 你到底想达到什么目的?为什么异步是一个问题?
  • 因为当到达其他方法时,适配器变为空......比我无法获得我的 spn_estado 微调器的位置

标签: android request synchronization android-volley


【解决方案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();
      }

这是一个阻塞调用,将在调用或收到错误后返回

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

【讨论】:

  • 没有工作打开那些括号......未来不接受它。我会为你更新我的问题,不明白发生了什么......为什么我要使用同步请求......
  • 你的意思是'没有工作打开那些括号......未来不接受它'?
  • Android Studio 说我使用 RequestFuture future = RequestFuture.newFuture();抱歉,我是 android 新手... :(
  • 谢谢你的眉毛!像魅力一样工作:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多