【问题标题】:Bug in AsyncTask causing random responseAsyncTask 中的错误导致随机响应
【发布时间】: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


【解决方案1】:

在 Crashalitics 中,您可以从捕获的异常中记录调试消息和堆栈跟踪。所以你的答案是正确收集这些信息,然后问题就会清楚

   // catch everythin n log everything
   } catch (ClientProtocolException e) {
       Crashlytics.logException(e);
    } catch (IOException e) {
       Crashlytics.logException(e);
    }

还在可能的崩溃之前放置日志消息

Crashlytics.log("Here is the async task that keeps giving me headache");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多