我对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都设置好了,但这只是崩溃了我的应用程序
答案 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