等待AsyncTask postExecute继续

时间:2019-03-10 16:18:12

标签: android android-asynctask

我对asynctask的概念很陌生,我有一个asynctask可以通过参数从api获取json,然后then(postexecute)将内容显示在textviews中(设置文本后将其设置为可见) ,问题是我正在尝试验证json实际上不是空的,并且实际上使用我的代码来执行此操作,但是如果我使用的参数正确,那么如果我尝试再次获取它,验证仍会检测到它为空(通过尝试触发asynctask的按钮),经过2或3次尝试,它实际上可以解决问题,我认为是因为我在后台执行此操作,这是asynctask

 private class ConsultarDatos extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {

        // params comes from the execute() call: params[0] is the url.
        try {
            return downloadUrl(urls[0]);
        } catch (IOException e) {
            return "Unable to retrieve web page. URL may be invalid.";
        }
    }
    // onPostExecute displays the results of the AsyncTask.
    @Override
    protected void onPostExecute(String result) {

        JSONArray ja = null;
        try {
            ja = new JSONArray(result);
            txtNombre.setText(ja.getString(0) +" " + ja.getString(1));
            txtCategoria.setText(ja.getString(2));
            txtDNI.setText(ja.getString(3));
            txtEstado.setText(ja.getString(4));
            //working=false;



        } catch (JSONException e) {
            e.printStackTrace();
        }

    }
}

这就是我想要做的

        btnGenerar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {


            new ConsultarDatos().execute("https://api-adress/file.php?DNI=" + etDNI.getText().toString());

            //while(working)
            //{

            //}
            if (txtCategoria.getText()!="") {
                btnGenerar.setVisibility(View.INVISIBLE);
                etDNI.setVisibility(View.INVISIBLE);
                txtCategoria.setVisibility(View.VISIBLE);
                txtDNI.setVisibility(View.VISIBLE);
                txtEstado.setVisibility(View.VISIBLE);
                txtNombre.setVisibility(View.VISIBLE);
                imgTarjeta.setVisibility(View.VISIBLE);

            }
            else
            {
                Toast.makeText(getApplicationContext(),"DNI Incorrecto",Toast.LENGTH_LONG).show();
            }

        }
    });

正如我评论的那样,我试图做一会儿,直到所有的textsviews都设置好了,但这只是崩溃了我的应用程序

2 个答案:

答案 0 :(得分:1)

我解决了这个问题,只是将可见性集和验证移到了onPostExecute的末尾,只是为了确保我也将吐司作为例外,以便用户得到一些反馈

 protected void onPostExecute(String result) {
        JSONArray ja = null;
        try {
            ja = new JSONArray(result);
            txtNombre.setText(ja.getString(0) +" " + ja.getString(1));
            txtCategoria.setText(ja.getString(2));
            txtDNI.setText(ja.getString(3));
            txtEstado.setText(ja.getString(4));

            if (txtCategoria.getText()!="") {
                btnGenerar.setVisibility(View.INVISIBLE);
                etDNI.setVisibility(View.INVISIBLE);
                txtCategoria.setVisibility(View.VISIBLE);
                txtDNI.setVisibility(View.VISIBLE);
                txtEstado.setVisibility(View.VISIBLE);
                txtNombre.setVisibility(View.VISIBLE);
                imgTarjeta.setVisibility(View.VISIBLE);

            }
            else
            {
                Toast.makeText(getApplicationContext(),"DNI Incorrecto",Toast.LENGTH_LONG).show();
            }



        } catch (JSONException e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(),"DNI Incorrecto",Toast.LENGTH_LONG).show();

        }

    }

答案 1 :(得分:0)

使用类似https://www.getpostman.com/的名称来查看API调用的结果。现在看来,您似乎不知道自己正在得到什么,以及回来的持续性如何。您需要验证服务器是否正在向您发送回有效数据。

使用json库来解析JSON响应,例如GSON或Moshi也会对您有所帮助。现在,您正在尝试获取基于任意数字的值。您可能只因缺少一个字段而有例外,但没有足够的信息可以说明。根据我的经验,Gson很容易设置:https://github.com/google/gson