【发布时间】:2016-03-26 17:54:05
【问题描述】:
我正在使用 AsyncTask 进行网络调用。如果成功,它应该返回一个 JSON 数组,并且到目前为止它在我测试的设备上运行良好(Google nexus 5)。 但在摩托罗拉设备上,它不起作用。从某种意义上说,它甚至没有向服务器发送请求。
代码如下:
private class SimpleTask extends AsyncTask<String, Void, String> {
ProgressDialog dialog;
@Override
protected void onPreExecute()
{
dialog = new ProgressDialog(MainActivity.this,ProgressDialog.STYLE_SPINNER);
dialog.setMessage("Loading Engine");
dialog.show();
}
protected String doInBackground(String... urls) {
String result = "";
try {
//HttpGet httpGet = new HttpGet(urls[0]);
HttpPost httpPost = new HttpPost(urls[0]);
HttpClient client = new DefaultHttpClient();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("number",details));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = client.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
InputStream inputStream = response.getEntity().getContent();
BufferedReader reader = new BufferedReader
(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
result += line;
}
}
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
//Log.w("PREMIERE::::",result);
return result;
}
protected void onPostExecute(String jsonString) {
//dialog.dismiss();
try {
if ((this.dialog != null) && this.dialog.isShowing()) {
this.dialog.dismiss();
}
} catch (final IllegalArgumentException e) {
// Handle or log or ignore
} catch (final Exception e) {
// Handle or log or ignore
} finally {
this.dialog = null;
}
showData(jsonString);
}
}
private void showData(String jsonString)
{
// try
// {
Log.w("VALS:",""+jsonString);
Gson gson = new Gson();
JsonParser parser = new JsonParser();
JsonArray jArray = parser.parse(jsonString).getAsJsonArray();
SharedPreferences pref = getSharedPreferences("ActivitySession", Context.MODE_PRIVATE);
for(JsonElement obj : jArray )
{
MainPojo cse = gson.fromJson( obj , MainPojo.class);
uid.add(cse);
}
if(!uid.isEmpty())
{
new SimpleTask2().execute(URL2);
}
else
{
Snackbar.make(this.findViewById(android.R.id.content), "Invalid Credentials", Snackbar.LENGTH_LONG).show();
}
/*
}
catch (Exception e){
Snackbar.make(this.findViewById(android.R.id.content), "Check data connection", Snackbar.LENGTH_LONG).show();
e.printStackTrace();
}*/
}
而且我故意没有捕获异常,并通过 Crashlytics 跟踪错误。该错误发生在这一行。
JsonArray jArray = parser.parse(jsonString).getAsJsonArray();
上面写着:
致命异常:java.lang.IllegalStateException:这不是 JSON 数组。
我认为当响应为空时也会发生这种情况,并且由于我也无法在服务器中跟踪请求,我相信这是因为没有发送请求。(如果错误,请纠正我)。
所以,我的问题是:我错过了什么吗?还是我定义 AsyncTask 的方式有什么问题?
编辑 1
PS:我在此 AsyncTask 中使用 HTTPS URL
【问题讨论】:
-
在您的
doInBackground中,您忽略了一些例外情况。尝试记录它们。 -
这条 Log 语句将什么写入日志?
Log.w("VALS:",""+jsonString); -
@StephenC ,在我的设备上我得到了正确的字符串,但在另一台设备上,我没有连接 logcat,只有 Crashlytics。仅获得崩溃痕迹!
-
你需要先解决那个问题。 '因为否则你只能猜测问题。
-
您的回复有问题。您的 Web 服务可能正在返回 jsonObject,而您正在尝试获取 JsonArray。先确认这件事
标签: java android android-asynctask