Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AsyncTask在第一次尝试时不会在onPostExecute上返回JSON响应,但从第二次尝试开始就可以正常工作_Java_Android - Fatal编程技术网

Java AsyncTask在第一次尝试时不会在onPostExecute上返回JSON响应,但从第二次尝试开始就可以正常工作

Java AsyncTask在第一次尝试时不会在onPostExecute上返回JSON响应,但从第二次尝试开始就可以正常工作,java,android,Java,Android,所以,我有一个方法,当按下按钮时会调用它,它应该向我的数据库添加一些信息(纬度、经度等)。奇怪的行为是,当我打开应用程序时,(应用程序添加了一个标记,按钮激活了,onMarkerClick),如果我按下该按钮,它将不起作用,JSON响应将为null,但使用相同的标记,第二次尝试时,它将正常工作(我在MarkerClick中获得纬度和经度。我已经检查了我使用doInBackground发送的每个param的值,每个参数看起来都很好,都有值等 该方法如下: public void Raporte

所以,我有一个方法,当按下按钮时会调用它,它应该向我的数据库添加一些信息(纬度、经度等)。奇怪的行为是,当我打开应用程序时,(应用程序添加了一个标记,按钮激活了,
onMarkerClick
),如果我按下该按钮,它将不起作用,
JSON
响应将为
null
,但使用相同的标记,第二次尝试时,它将正常工作(我在MarkerClick中获得纬度和经度。我已经检查了我使用
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();
    }
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();
    }

}

根据@Mike M.,我实际上错检了
descripere1
的值,该值实际上是
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);
            }
public void raporteazalerta(){
User User=SharedPrefManager.getInstance(this.getUser();
最终字符串lat=String.valueOf(纬度标记);
最终字符串longit=字符串.valueOf(longitudine_标记);
最终字符串问题1=字符串.valueOf(问题a+1);
字符串描述符1=描述符;
if(descripere1==null){
descripere1=“null”;
}
最终字符串id_user=String.valueOf(user.getId());
id=id\u用户;
最终字符串finalDescriere=descripere1;
类RaporteazaAlerta扩展了AsyncTask{
@凌驾
受保护的字符串背景(无效…无效){
//创建请求处理程序对象
RequestHandler RequestHandler=新的RequestHandler();
//创建请求参数
HashMap params=新的HashMap();
参数put(“latitudine”,lat);
参数put(“longitudine”,longit);
参数put(“id_problema”,problema1);
参数put(“ID_user”,ID_user);
参数put(“描述”,最终描述);
//重复回答
return requestHandler.sendPostRequest(URL.URL\u ALERTA,params);
}

Harta.java:563中的代码行是什么?另外,你能发布你的fill logcat输出吗?“我已经检查了我使用doInBackground发送的每个
param
的值,每个参数看起来都很好,都有值等。”–堆栈跟踪似乎真的表明您在
参数中传递了至少一个空值。我认为当您第一次按下按钮时,数据仍在处理中,您看不到它,当您再次按下按钮时,您将从第一次按下中得到结果,我猜请检查该语句“最终字符串描述符1=描述符;”
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)
    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);
            }