【问题标题】:AsyncTask does not return a JSON response on onPostExecute in the first try, but works fine starting from second tryAsyncTask 在第一次尝试时不会在 onPostExecute 上返回 JSON 响应,但从第二次尝试开始就可以正常工作
【发布时间】:2020-03-12 19:56:45
【问题描述】:

所以,我有一个在按下按钮时调用的方法,它应该向我的数据库添加一些信息(纬度、经度等)。奇怪的行为是,当我打开应用程序时,(应用程序添加一个标记,并且按钮激活onMarkerClick)如果我按下该按钮,它将不起作用,JSON 响应将是null,但相同的标记,第二次尝试它会正常工作(我在onMarkerClick 内得到纬度和经度。我检查了我使用doInBackground 发送的每个param 的值,每个参数看起来都很好,有一个值等.

这就是方法:

  public void RaporteazaAlerta() {
        User user = SharedPrefManager.getInstance(this).getUser();
        final String lat = String.valueOf(latitudine_marker);
        final String longit = String.valueOf(longitudine_marker);
        final String problema1 = String.valueOf(problema+1);
        final String descriere1 = descriere;
        final String id_user =  String.valueOf(user.getId());
        id= id_user;
        class  RaporteazaAlerta extends AsyncTask<Void, Void, String> {

            @Override
            protected String doInBackground(Void... voids) {
                //creating request handler object
                RequestHandler requestHandler = new RequestHandler();

                //creating request parameters
                HashMap<String, String> params = new HashMap<>();
                params.put("latitudine", lat);
                params.put("longitudine", longit);
                params.put("id_problema", problema1);
                params.put("ID_user", id_user);
                params.put("descriere", descriere1);

                //returing the response
                return requestHandler.sendPostRequest(URLs.URL_ALERTA, params);
            }

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                //displaying the progress bar while user registers on the server
            }

            @Override
            protected void onPostExecute(String s) {{
                super.onPostExecute(s);


                try {
                    JSONObject obj = new JSONObject(s);

                    //if no error in response
                    if (!obj.getBoolean("error")) {
                        Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();

                    } else {
                        Toast.makeText(getApplicationContext(), "Nu se poate adauga alerta", Toast.LENGTH_SHORT).show();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                layout_buton.setVisibility(View.GONE);
                linearLayout.setVisibility(View.GONE);
                linearLayout_obs.setVisibility(View.GONE);
                linearLayout_obs_inapoi.setVisibility(View.GONE);
                observatii.setText(null);
                hideSoftKeyboard(observatii);
            }
            }
        }
        RaporteazaAlerta report = new RaporteazaAlerta();
        report.execute();
    }

查看日志获取更多信息,我发现有一个System.err

W/System.err:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int java.lang.String.length()” 在:

2020-03-12 13:29:40.385 23142-23262/com.scopesystems.cityalert W/System.err:     at java.net.URLEncoder.encode(URLEncoder.java:205)
2020-03-12 13:29:40.385 23142-23262/com.scopesystems.cityalert W/System.err:     at com.scopesystems.cityalert.suport.RequestHandler.getPostDataString(RequestHandler.java:69)
2020-03-12 13:29:40.385 23142-23262/com.scopesystems.cityalert W/System.err:     at com.scopesystems.cityalert.suport.RequestHandler.sendPostRequest(RequestHandler.java:35)
2020-03-12 13:29:40.386 23142-23262/com.scopesystems.cityalert W/System.err:     at com.scopesystems.cityalert.ui.Harta$1RaporteazaAlerta.doInBackground(Harta.java:579)
2020-03-12 13:29:40.386 23142-23262/com.scopesystems.cityalert W/System.err:     at com.scopesystems.cityalert.ui.Harta$1RaporteazaAlerta.doInBackground(Harta.java:563)

RequestHandler 在第二次尝试时运行良好,与任何其他AsyncTask 一起使用:

public class RequestHandler {
    public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) {
        URL url;

        StringBuilder sb = new StringBuilder();
        try {
            url = new URL(requestURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(15000);
            conn.setConnectTimeout(15000);
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);

            OutputStream os = conn.getOutputStream();

            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(getPostDataString(postDataParams));

            writer.flush();
            writer.close();
            os.close();
            int responseCode = conn.getResponseCode();

            if (responseCode == HttpsURLConnection.HTTP_OK) {

                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                sb = new StringBuilder();
                String response;

                while ((response = br.readLine()) != null) {
                    sb.append(response);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

    private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
        StringBuilder result = new StringBuilder();
        boolean first = true;
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (first)
                first = false;
            else
                result.append("&");
            result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }
        return result.toString();
    }

}

在日志中还有一些关于org.json.JSONException: End of input at character 0 of 的信息,但我认为这是因为我没有收到来自服务器的任何响应。

编辑:完整的 logput 输出:

2020-03-12 13:50:13.901 23545-23598/com.scopesystems.cityalert W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
2020-03-12 13:50:13.901 23545-23598/com.scopesystems.cityalert W/System.err:     at java.net.URLEncoder.encode(URLEncoder.java:205)
2020-03-12 13:50:13.901 23545-23598/com.scopesystems.cityalert W/System.err:     at com.scopesystems.cityalert.suport.RequestHandler.getPostDataString(RequestHandler.java:69)
2020-03-12 13:50:13.901 23545-23598/com.scopesystems.cityalert W/System.err:     at com.scopesystems.cityalert.suport.RequestHandler.sendPostRequest(RequestHandler.java:35)
2020-03-12 13:50:13.902 23545-23598/com.scopesystems.cityalert W/System.err:     at com.scopesystems.cityalert.ui.Harta$1RaporteazaAlerta.doInBackground(Harta.java:579)
2020-03-12 13:50:13.902 23545-23598/com.scopesystems.cityalert W/System.err:     at com.scopesystems.cityalert.ui.Harta$1RaporteazaAlerta.doInBackground(Harta.java:563)
2020-03-12 13:50:13.902 23545-23598/com.scopesystems.cityalert W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:304)
2020-03-12 13:50:13.902 23545-23598/com.scopesystems.cityalert W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
2020-03-12 13:50:13.902 23545-23598/com.scopesystems.cityalert W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
2020-03-12 13:50:13.902 23545-23598/com.scopesystems.cityalert W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
2020-03-12 13:50:13.902 23545-23598/com.scopesystems.cityalert W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
2020-03-12 13:50:13.902 23545-23598/com.scopesystems.cityalert W/System.err:     at java.lang.Thread.run(Thread.java:761)
2020-03-12 13:50:13.906 23545-23545/com.scopesystems.cityalert W/System.err: org.json.JSONException: End of input at character 0 of 
2020-03-12 13:50:13.906 23545-23545/com.scopesystems.cityalert W/System.err:     at org.json.JSONTokener.syntaxError(JSONTokener.java:449)
2020-03-12 13:50:13.906 23545-23545/com.scopesystems.cityalert W/System.err:     at org.json.JSONTokener.nextValue(JSONTokener.java:97)
2020-03-12 13:50:13.906 23545-23545/com.scopesystems.cityalert W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:156)
2020-03-12 13:50:13.906 23545-23545/com.scopesystems.cityalert W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:173)
2020-03-12 13:50:13.906 23545-23545/com.scopesystems.cityalert W/System.err:     at com.scopesystems.cityalert.ui.Harta$1RaporteazaAlerta.onPostExecute(Harta.java:594)
2020-03-12 13:50:13.906 23545-23545/com.scopesystems.cityalert W/System.err:     at com.scopesystems.cityalert.ui.Harta$1RaporteazaAlerta.onPostExecute(Harta.java:563)
2020-03-12 13:50:13.906 23545-23545/com.scopesystems.cityalert W/System.err:     at android.os.AsyncTask.finish(AsyncTask.java:660)
2020-03-12 13:50:13.906 23545-23545/com.scopesystems.cityalert W/System.err:     at android.os.AsyncTask.-wrap1(AsyncTask.java)
2020-03-12 13:50:13.907 23545-23545/com.scopesystems.cityalert W/System.err:     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)
2020-03-12 13:50:13.907 23545-23545/com.scopesystems.cityalert W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
2020-03-12 13:50:13.907 23545-23545/com.scopesystems.cityalert W/System.err:     at android.os.Looper.loop(Looper.java:154)
2020-03-12 13:50:13.907 23545-23545/com.scopesystems.cityalert W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6077)
2020-03-12 13:50:13.907 23545-23545/com.scopesystems.cityalert W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2020-03-12 13:50:13.907 23545-23545/com.scopesystems.cityalert W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
2020-03-12 13:50:13.907 23545-23545/com.scopesystems.cityalert W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

【问题讨论】:

  • Harta.java:563 中的代码行是什么
  • 另外,你能发布你的填充 logcat 输出吗?
  • "我已经检查了我使用 doInBackground 发送的每个param 的值,每个参数看起来都很好,有一个值等。" – 该堆栈跟踪似乎确实表明您在params 中传递了至少一个空值。
  • 我想当你第一次按下按钮时,数据仍在处理中,你看不到它,当你再次按下它时,你会得到第一次按下的结果,我猜
  • 检查语句“final String descriere1 = descriere;”

标签: java android


【解决方案1】:

根据@Mike M.,我实际上错过了descriere1 的值,它确实是null。 null表示没有添加描述,所以我改了代码:

    public void RaporteazaAlerta() {
        User user = SharedPrefManager.getInstance(this).getUser();
        final String lat = String.valueOf(latitudine_marker);
        final String longit = String.valueOf(longitudine_marker);
        final String problema1 = String.valueOf(problema+1);
        String descriere1 = descriere;
        if(descriere1 == null){
            descriere1 = "null";
        }

      final String id_user =  String.valueOf(user.getId());
        id= id_user;
        final String finalDescriere = descriere1;
        class  RaporteazaAlerta extends AsyncTask<Void, Void, String> {

            @Override
            protected String doInBackground(Void... voids) {
                //creating request handler object
                RequestHandler requestHandler = new RequestHandler();

                //creating request parameters
                HashMap<String, String> params = new HashMap<>();
                params.put("latitudine", lat);
                params.put("longitudine", longit);
                params.put("id_problema", problema1);
                params.put("ID_user", id_user);
                params.put("descriere", finalDescriere);

                //returing the response
                return requestHandler.sendPostRequest(URLs.URL_ALERTA, params);
            }

【讨论】:

    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    相关资源
    最近更新 更多