Ошибка получения широковещательного намерения {act=location_update flg=0x10 (имеет дополнения)} с JSONObject

Я пытаюсь разобрать JSONObject внутри BroadcastReceiver, и мое приложение продолжает сбоить, показывая мне эту ошибку Ошибка получения широковещательной передачи Intent { act=location_update flg=0x10 (имеет дополнительные функции) } в строке 122 (JSONObject jsonObject= new JSONObject(json_string);) Хотя, когда я удаляю всю часть синтаксического анализа, все идет хорошо. Вот необходимый код:

@Override
protected void onResume() {
    super.onResume();
    if(broadcastReceiver == null){
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                try {
                    getJSON();
                    JSONObject jsonObject= new JSONObject(json_string);
                    JSONArray jsonArray = jsonObject.getJSONArray("response");

                    int i=0 ;
                    Double latitude, longitude;
                    while (i<jsonArray.length()){
                        JSONObject jo= jsonArray.getJSONObject(i);
                        latitude = jo.getDouble("latitude");
                        longitude = jo.getDouble("longitude");
                        map.addMarker(new MarkerOptions()
                                .position(new LatLng(latitude,longitude))
                                .icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi))
                                .title("taxi"));
                        i++;
                } }catch (JSONException e) {
                    e.printStackTrace();
                }

                lngg= intent.getDoubleExtra("longitude",-1);
                latt= intent.getDoubleExtra("latitude",-1);

                map.addMarker(new MarkerOptions()
                        .position(new LatLng(latt,lngg))
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.locationpeople1))
                        .title("I am here "));
            }
        };
    }
    registerReceiver(broadcastReceiver, new IntentFilter("location_update"));

}

public void getJSON(){
new BackgroundTask().execute();

}


class BackgroundTask extends AsyncTask<Void,Void,String>{
    String JSON_STRING;
    String json_url ;
    @Override
    protected void onPreExecute() {

        json_url="http://frequentative-hicko.000webhostapp.com/A.php";
    }

    @Override
    protected String doInBackground(Void... voids) {

        try {
            URL url = new URL(json_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader= new BufferedReader( new InputStreamReader(inputStream));
            StringBuilder stringBuilder= new StringBuilder();
            while( (JSON_STRING = bufferedReader.readLine()) != null ){

             stringBuilder.append(JSON_STRING+"\n");
            }
            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();
            return stringBuilder.toString().trim();




        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result) {
       // TextView textView =(TextView) findViewById(R.id.textView2);
       // textView.setText(result); //JSON Format
        json_string=result;
    }
}
public  void parseJSON(View view){
  if(json_string == null){
      Toast.makeText(getApplicationContext(),"Aucun taxi n'est disponible pour l'instant",Toast.LENGTH_LONG);
  }
  }
}

person Naisy    schedule 26.03.2017    source источник
comment
Ваш вызов getJSON создает новую задачу, которая будет выполняться в другом потоке. Так что, вероятно, у new JSONObject(json_string); есть json_string = null. Можете ли вы поставить отметку, если проверяете это прямо над вашим jsonObject = new ... ?   -  person Kayan Almeida    schedule 26.03.2017
comment
хорошо, сейчас попробую   -  person Naisy    schedule 26.03.2017
comment
Нет, на самом деле он показал мне ошибку.   -  person Naisy    schedule 26.03.2017
comment
Пожалуйста, опубликуйте полную трассировку стека.   -  person Code-Apprentice    schedule 26.03.2017
comment
Без проблем выложу   -  person Naisy    schedule 26.03.2017
comment
Извините, я просто слишком долго не знал, какую часть я должен опубликовать   -  person Naisy    schedule 26.03.2017


Ответы (1)


Я не знаю, когда вы отправляете свою трансляцию, но вот проблема: когда вы вызываете свой getJSON, вы говорите андроиду запустить экземпляр вашего BackgroundTask в другом потоке. Так он казнит тебя

JSONObject jsonObject= new JSONObject(json_string); // and all the rest

до того, как ваше getJSON() закончится. Пожалуйста, попробуйте переместить всю свою логику после getJSON() в onPostExecute().

Что-то вроде этого:

@Override
protected void onPostExecute(String result) {
   // This is called when you finish your background task
   // so here is the right place to parse your json response and add yout markers :)
    json_string=result;
    try {
        JSONObject jsonObject= new JSONObject(json_string);
        JSONArray jsonArray = jsonObject.getJSONArray("response");

        int i=0 ;
        Double latitude, longitude;
        while (i<jsonArray.length()){
            JSONObject jo= jsonArray.getJSONObject(i);
            latitude = jo.getDouble("latitude");
            longitude = jo.getDouble("longitude");
            map.addMarker(new MarkerOptions()
                    .position(new LatLng(latitude,longitude))
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi))
                    .title("taxi"));
            i++;
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

}

А в вашем onReceive как-то так:

@Override
public void onReceive(Context context, Intent intent) {

    getJSON();
    lngg= intent.getDoubleExtra("longitude",-1);
    latt= intent.getDoubleExtra("latitude",-1);

    map.addMarker(new MarkerOptions()
            .position(new LatLng(latt,lngg))
            .icon(BitmapDescriptorFactory.fromResource(R.drawable.locationpeople1))
            .title("I am here "));
}
person Kayan Almeida    schedule 26.03.2017
comment
Ну, я периодически отправляю свою трансляцию из GPS_Service (каждые 5 секунд), не могли бы вы объяснить подробнее, что мне делать! - person Naisy; 26.03.2017
comment
Я отредактировал свой ответ с возможным решением, но вам нужно понять, что ваш getJSON является асинхронным, поэтому сразу после его вызова у вас не будет действительного json_string, потому что ваша задача выполняется в фоновом режиме. - person Kayan Almeida; 26.03.2017
comment
Я сделал то, что вы сказали, сэр, приложение больше не крашится, но все равно не делает то, что должно (нет маркеров на карте) - person Naisy; 26.03.2017
comment
Отредактировано снова, ваша логика размещения маркера была правильной, только ваш анализ JSON, который должен быть выполнен внутри onPostExecute. Мы почти там! - person Kayan Almeida; 26.03.2017
comment
Спасибо, попробую - person Naisy; 26.03.2017
comment
Извините, не понял, что такое же? - person Kayan Almeida; 26.03.2017
comment
Я имею в виду, что он все еще не показывает другие маркеры на карте. - person Naisy; 26.03.2017
comment
Ааа, хорошо, это еще одна проблема, я думаю, но теперь ваш код не падает, и ваш синтаксический анализ json работает, верно? - person Kayan Almeida; 26.03.2017
comment
Приложение не ломается, но когда дело доходит до синтаксического анализа, работает только эта часть: TextView textView =(TextView) findViewById(R.id.textView2); textView.setText (результат); json_string = результат; - person Naisy; 26.03.2017
comment
Что такое трассировка стека? - person Kayan Almeida; 26.03.2017
comment
Мне очень жаль, но что вы имеете в виду! - person Naisy; 26.03.2017
comment
Вы сказали, что теперь ваш новый код работает до json_string=result;, после чего ничего не происходит. Откройте свой logcat (alt + 6 в студии Android), и вы увидите журналы вашего устройства. Он должен показать журнал исключений, вероятно, JsonParseException - person Kayan Almeida; 26.03.2017
comment
Я нашел эти три: org.json.JSONException: нет значения для успеха в org.json.JSONObject.get(JSONObject.java:355) в org.json.JSONObject.getBoolean(JSONObject.java:376) - person Naisy; 26.03.2017
comment
Это означает, что ваш анализ json неверен, вы можете распечатать свой json_string? - person Kayan Almeida; 26.03.2017
comment
Вот это json_string={ответ:{успех:истина,0:{долгота:0.00000000,широта:0.00000000},1:{долгота:1.33426070,широта:36.15379560},2:{долгота:5.55550000,широта:6.66600000}}} - person Naisy; 26.03.2017
comment
Я не знаю, почему успех показывает правду, но когда я попытался напечатать его, он сказал: «Нет ценности для успеха». - person Naisy; 26.03.2017
comment
Спасибо, сэр, я решил проблему, как вы сказали, я переместил все это в onPosteExecute, чем удалил $response[success] = false; и $response[success] = true; из файла php - person Naisy; 26.03.2017
comment
Рад, что помог :). Не могли бы вы отметить ответ как правильный в этом случае? - person Kayan Almeida; 26.03.2017
comment
Да, конечно;) это решило ошибку, которую я написал в заголовке. - person Naisy; 26.03.2017